題目描述:
假設這有一個各種字母組成的字符串A,和另外一個字符串B,字符串裏B的字母數相對少一些。什麼方法能最快的查出所有小字符串B裏的字母在大字符串A裏都有?
比如,如果是下面兩個字符串:
String 1: ABCDEFGHLMNOPQRS
String 2: DCGSRQPO
答案是true,所有在string2裏的字母string1也都有。
思路總結如下:
1.定義最小的26個素數分別與字符'A'到'Z'對應。
2.遍歷長字符串,求得每個字符對應素數的乘積。
3.遍歷短字符串,判斷乘積能否被短字符串中的字符對應的素數整除。
4.輸出結果。
至此,如上所述,上述算法的時間複雜度爲O(m+n),時間複雜度最好的情況爲O(n)(遍歷短的字符串的第一個數,與長字符串素數的乘積相除,即出現餘數,便可退出程序,返回false),n爲長字串的長度,空間複雜度爲O(1)。如你所見,我們已經優化到了最好的程度。
代碼:
public static void function()
{
int primeNumber[26] = {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 = "DCGSRQPOM";
long long product = 1; //大整數除法的代碼,下頭給出。
// 遍歷長字符串,得到每個字符對應素數的乘積
for (int i = 0; i < strOne.length(); i++)
{
int index = strOne[i] - 'A';
product = product * primeNumber[index];
}
// 遍歷短字符串
for (int j = 0; j < strTwo.length(); j++)
{
int index = strTwo[j] - 'A';
// 如果餘數不爲0,說明不包括短字串中的字符,跳出循環
if (product % primeNumber[index] != 0)
break;
}
// 如果積能整除短字符串中所有字符則輸出"true",否則輸出"false"。
if (strTwo.length() == j)
System.out.println("true");
else
System.out.println("false");
}