Java實(shí)現(xiàn)字符串的匹配
假設(shè)我們有一個(gè)一定個(gè)數(shù)的字母組成字串,我給每個(gè)字母分配一個(gè)素?cái)?shù),從2開(kāi)始,往后類推。這樣A將會(huì)是2,B將會(huì)是3,C將會(huì)是5,等等。現(xiàn)在我遍歷第一個(gè)字串,把每個(gè)字母代表的素?cái)?shù)相乘。你最終會(huì)得到一個(gè)很大的整數(shù),對(duì)吧?
然后——輪詢第二個(gè)字符串,用每個(gè)字母除它。如果除的結(jié)果有余數(shù),這說(shuō)明有不匹配的字母。如果整個(gè)過(guò)程中沒(méi)有余數(shù),你應(yīng)該知道它是第一個(gè)字串恰好的子集了。
思路總結(jié)如下:
1.定義最小的26個(gè)素?cái)?shù)分別與字符'A'到'Z'對(duì)應(yīng)。
2.遍歷長(zhǎng)字符串,求得每個(gè)字符對(duì)應(yīng)素?cái)?shù)的乘積。
3.遍歷短字符串,判斷乘積能否被短字符串中的字符對(duì)應(yīng)的素?cái)?shù)整除。
4.輸出結(jié)果。
至此,如上所述,上述算法的時(shí)間復(fù)雜度為O(m+n),時(shí)間復(fù)雜度最好的情況為O(n)
package contcurrentandalgorithm; /** * * @author Administrator * zyyjiao@mail.ustc.edu.cn */ public class SushuStringFind { public static void main(String[] args) { int primeNumber[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101}; String strOne = "ABCDEFGHLMNOPQRS"; String strTwo = "ABCDEFGHL"; // 這里需要用到大整數(shù) int product = 1; //大整數(shù)除法的代碼,下頭給出。 // 遍歷長(zhǎng)字符串,得到每個(gè)字符對(duì)應(yīng)素?cái)?shù)的乘積 for (int i = 0; i < strOne.length(); i++) { int index = strOne.charAt(i) - 'A'; product = product * primeNumber[index]; } // 遍歷短字符串 for (int j = 0; j < strTwo.length(); j++) { int index = strTwo.charAt(j) - 'A'; // 如果余數(shù)不為0,說(shuō)明不包括短字串中的字符,跳出循環(huán) if (product % primeNumber[index] != 0) { break; } if (strTwo.length() == j) //cout << "true" << endl; { System.out.println("true"); } else //cout << "false" << endl; { System.out.println("false"); } } } } |
posted on 2013-11-28 11:18 順其自然EVO 閱讀(375) 評(píng)論(0) 編輯 收藏