給定兩個分別由字母組成的字串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。
最直觀也是最簡單的思路是,針對string2中每乙個字元,逐個與string1中每個字元比較,看它是否在string1中。假設n是字串string1的長度,m是字串string2的長度,那麼此演算法,需要o(n*m)次操作。
實現的函式**:
bool stringcontain(string &a, string &b)如果允許排序的話,我們可以考慮下排序。比如可先對這兩個字串的字母進行排序,然後再同時對兩個字串依次輪詢。兩個字串的排序需要(常規情況)o(m log m) + o(n log n)次操作,之後的線性掃瞄需要o(m+n)次操作。}if(j >=a.length())
return
false
; }
return
true
;}
實現的函式**如下:
void qsort(string &a, int l, int事實上,可以先把長字串a中的所有字元都放入乙個hashtable裡,然後輪詢短字串b,看短字串b的每個字元是否都在hashtable裡,如果都存在,說明長字串a包含短字串b,否則,說明不包含。r) a[i] =c;
qsort(a, l, i-1
); qsort(a, i+1
, r);
}}bool stringcontain_sort(string &a, string &b)
if (a[ai] ==b[bj])
else
return
false
; }
return
true
;}
再進一步,我們可以對字串a,用位運算(26bit整數表示)計算出乙個「簽名」,再用b中的字元到a裡面進行查詢。
這個方法的實質是用乙個整數代替了hashtable,空間複雜度為o(1),時間複雜度還是o(n + m)
實現的函式**如下:(有些問題,結果不正確)
bool stringcontain_hash(string &a, string &b)對函式測試部分的檔案:for (int j = 0; j < b.length(); ++j)
}return
true
;}
1 #include字串包含的測試 mian() 函式2 #include 3 #include 4
5using
namespace
std;
6bool stringcontain(string &a, string &b)717
}18if(j >=a.length())
19return
false;20
}21return
true;22
}23void qsort(string &a, int l, int
r)24
45 a[i] =c;
46 qsort(a, l, i-1
);47 qsort(a, i+1
, r);48}
49}50bool stringcontain_sort(string &a, string &b)
5160
if (a[ai] ==b[bj])
6164
else
65return
false;66
}67return
true;68
}69bool stringcontain_hash(string &a, string &b)
7076
for (int j = 0; j < b.length(); ++j)
7782}83
return
true;84
}8586void
main()
87
LeetCode初級演算法練習 字串
344 反轉字串 請編寫乙個函式,其功能是將輸入的字串反轉過來。示例 輸入 s hello 返回 olleh class solution def reversestring self,s type s str rtype str 開始 結束 步進 步進預設 1 return s 1 7 反轉整數 ...
串結構練習 字串匹配
time limit 1000ms memory limit 65536k 給定兩個字串string1和string2,判斷string2是否為string1的子串。輸入包含多組資料,每組測試資料報含兩行,第一行代表string1,第二行代表string2,string1和string2中保證不出現...
串結構練習 字串匹配
time limit 1000ms memory limit 65536k 給定兩個字串string1和string2,判斷string2是否為string1的子串。輸入包含多組資料,每組測試資料報含兩行,第一行代表string1,第二行代表string2,string1和string2中保證不出現...