根據以下網站的文章整理:
http://developer.51cto.com/art/201207/347641.htm
問題:假設這有一個各種字母組成的字符串,假設這還有另外一個字符串,而且這個字符串裏的字母數相對少一些。從算法是講,什麼方法能最快的查出所有小字符串裏的字母在大字符串裏都有?
比如,如果是下面兩個字符串:String 1: ABCDEFGHLMNOPQRS String 2:DCGSRQPOM
答案是true,所有在string2裏的字母string1也都有。
如果是下面兩個字符串:String 3: ABCDEFGHLMNOPQRS String 4:DCGSRQPOZ
答案是false,因爲第二個字符串裏的Z字母不在第一個字符串裏。【以下分析、代碼均默認第一個參數是短的字符串str1,第二個參數是長字符串str2.】
1.最最笨的辦法應該是兩個for循環。依次取str1(較短的字符串)的每個字符,順次在str2中搜尋。(代碼如下:)
bool fun_1(char *str1,char *str2)
{
char ch;
for(int i=0;i<strlen(str1);i++)
{
ch = str1[i];
for(int j=0;j<strlen(str2);j++)
{
if(ch==str2[j]) continue;
if(j==strlen(str2)) return false;
}
}
return true;}
當然,對於上面的方法可以稍加改進。對str1和str2分別進行去除重複字母的處理。這樣,上述的循環次數就會減少,相應的,會增加對兩個字符串的處理時間。(在此不再贅述)
2.對於兩個字符串進行相同的處理,對字母A - Z賦予素數1,2,3,5...
計算出str1(較長的字符串)的每個字母對應的素數乘積(不計算重複的)sum;
依次取str2(較短的)每個字母對應的素數與sum相除(重複的只計算一次),得出最終的結果爲整數,則表示返回結果應爲true,否則,爲false.(代碼略)