演算法練習 字串包含

2022-07-20 10:09:11 字數 2421 閱讀 7680

給定兩個分別由字母組成的字串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)

}if(j >=a.length())

return

false

; }

return

true

;}

如果允許排序的話,我們可以考慮下排序。比如可先對這兩個字串的字母進行排序,然後再同時對兩個字串依次輪詢。兩個字串的排序需要(常規情況)o(m log m) + o(n log n)次操作,之後的線性掃瞄需要o(m+n)次操作。

實現的函式**如下:

void qsort(string &a, int l, int

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中的所有字元都放入乙個hashtable裡,然後輪詢短字串b,看短字串b的每個字元是否都在hashtable裡,如果都存在,說明長字串a包含短字串b,否則,說明不包含。

再進一步,我們可以對字串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 

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

字串包含的測試 mian() 函式

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中保證不出現...