問題
*給定兩個分別由字母組成的字串a和字串b,字串b的長度比字串a短。請問,如何最快地判斷字串b中所有字母是否都在字串a裡?
為了簡單起見,我們規定輸入的字串只包含大寫英文本母,請實現函式bool stringcontains(string &a, string &b)
比如,如果是下面兩個字串:
string 1:abcd
string 2:bad
答案是true,即string2裡的字母在string1裡也都有,或者說string2是string1的真子集。
如果是下面兩個字串:
string 1:abcd
string 2:bce
答案是false,因為字串string2裡的e字母不在字串string1裡。
同時,如果string1:abcd,string 2:aa,同樣返回true。*
將string b中的字元乙個乙個的與a中進行比較,若全部存在則返回true,反之則返回false,這個方法屬於暴力法,肯定可以解出來,但是複雜度會比較高。該種方法的時間複雜度為o(m*n)。
bool stringcontains(string &a, string &b)
return true;
}
上述string都是亂序排列,那麼在判斷包含前,我們如果將兩個string都先進行排序,然後再比較,會不會更好一些呢?例如:
adface--->aacdef
dabe--->abde
那麼此時在比較的時候我們就沒有必要逐個字元進行比較,而只需要比較前面比較小的字元即可,例如b我們只需要比較aac就可以判斷出字元」dabe」不包含在」adface」中,這種方法的時間複雜度為兩個字串的排序需要(常規情況)o(n^2)次操作,這種排序的複雜度比暴力法還要複雜,所以排序演算法是推薦使用快速排序的,其時間複雜度為o(n*logn),之後的線性掃瞄需要o(m+n)次操作。
void sort(string &a)
}}bool stringcontains(string &a, string &b)
return true;
}
素數相乘法:這種方法屬於比較巧妙的型別,將26個字母對應成相應的26個素數,這樣就可以將母字串中的字母使用素數的乘積product來表示,根據素數的特性:素數只能被1和它本身相除,那麼就可以使用product來除以子字串b中的每個字母對應的素數,若能除斷,則表明b包含在母陣列中,若不能除斷,則不在母陣列中。該演算法的複雜度為o(m+n)。
**如下:
bool stringcontains(string &a, string &b);
int product = 1;
for(int i=0; i使用素數相乘法需要注意一下幾個問題:
1.溢位問題。當字串足夠長的時候就比較容易溢位。
2.字母大小寫問題。在判斷這個字串的時候,其實是隱含了乙個條件,那就是判斷的字母都是小寫,如果判斷的字母是大小寫混合,那麼就更容易溢位,所以這種方法的實際意義不是特別大。
位運算:**如下:
bool stringcontains(string &a, string &b){
int hash = 0;
for(int i=0; i位運算的思路很簡單,那就是假設a~z有26個字母,那麼對應的有26bit位來表示該字元。如該字元存在,則通過移位使得相應的bit位上置為1,這樣就可以將string a上的字元都對應到相應的bit位上。那麼對於string b上我們該如何操作呢?也是使用移位的方法,然後將string b上每個字元對應的bit位與hash進行&運算,如果結果為0,那就表示string a中沒有該字元。如圖所示:
hash值表示的是字串a整體移位過後的值,綠色箭頭表示的是單個的字元與其進行&運算過後的值,若&運算結果為1,表明該字元在字串a中,例如字元a,b。若&運算結果為0,表明該字元不在字串a中,如c。
字串包含
給定乙個長字串a和乙個短字串b,請問,如何最快地判斷出短字串b中的所有字元是否都在長字串a中?輪詢短字串b中的每乙個字元,逐個與長字串a中的每個字元比較,看是否都在字串a中。實現 public class stringcontain return true public static void ma...
字串包含
題目描述 給定兩個分別由字母組成的字串a和字串b,字串b的長度比字串a短。請問,如何最快地判斷字串b中所有字母是否都在字串a裡?實現函式bool stringcontains string a,string b 比如,如果是下面兩個字串 string 1 abcd string 2 bad 答案是t...
字串包含
位運算真的是最討厭的東西了,沒有之一。指標我還能列印個位址。瞅了半天 勉強看明白了一點點。先記著。這個 也不完善,容易超出int限制。但是似乎很常見 includeint contain char s,int len1,char s1,int len2 int hash 0 int i,j for ...