判斷兩個字符串是否爲包含關係

題目描述:
假設這有一個各種字母組成的字符串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");  
} 



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章