字串包含

2022-08-24 02:03:13 字數 1413 閱讀 2700

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裡查詢是否存在.複雜度是o(n*m)

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

假設有乙個僅由字母組成字串,讓每個字母與乙個素數對應,從2開始,往後類推,a對應2,b對應3,c對應5,......。遍歷第乙個字串,把每個字母對應素數相乘。最終會得到乙個整數。

利用上面字母和素數的對應關係,對應第二個字串中的字母,然後輪詢,用每個字母對應的素數除前面得到的整數。如果結果有餘數,說明結果為false。如果整個過程中沒有餘數,則說明第二個字串是第乙個的子集了(判斷是不是真子集,可以比較兩個字串對應的素數乘積,若相等則不是真子集)。

思路總結如下:

按照從小到大的順序,用26個素數分別與字元'a'到'z'一一對應。

遍歷長字串,求得每個字元對應素數的乘積。

遍歷短字串,判斷乘積能否被短字串中的字元對應的素數整除。

輸出結果。

如前所述,演算法的時間複雜度為o(m+n)的最好的情況為o(n)(遍歷短的字串的第乙個數,與長字串素數的乘積相除,即出現餘數,便可退出程式,返回false),n為長字串的長度,空間複雜度為o(1)。

此種素數相乘的方法看似完美,但缺點是素數相乘的結果容易導致整數溢位。

如果面試官繼續追問,還有沒有更好的辦法呢?計數排序?除了計數排序呢?

事實上,可以先把長字串a中的所有字元都放入乙個hashtable裡,然後輪詢短字串b,看短字串b的每個字元是否都在hashtable裡,如果都存在,說明長字串a包含短字串b,否則,說明不包含。

再進一步,我們可以對字串a,用位運算(26bit整數表示)計算出乙個「簽名」,再用b中的字元到a裡面進行查詢。

這裡july用的是類似hash的做法:

bool stringcontain(string &a,string &b)

for (int i = 0; i < b.length(); ++i)

}return

true

;}

這個方法的實質是用乙個整數代替了hashtable,空間複雜度為o(1),時間複雜度還是o(n + m)。

1、變位詞

字串包含

問題 給定兩個分別由字母組成的字串a和字串b,字串b的長度比字串a短。請問,如何最快地判斷字串b中所有字母是否都在字串a裡?為了簡單起見,我們規定輸入的字串只包含大寫英文本母,請實現函式bool stringcontains string a,string b 比如,如果是下面兩個字串 string...

字串包含

給定乙個長字串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...