字串包含問題

2021-07-11 23:02:46 字數 2038 閱讀 5936

(1)問題描述:存在字串1和字串2,假設字串2相對較短,如何快速地判定字串2中的字元都存在於字串1裡(假定字串只包含字母)?

(2)舉例:字串1為abcdefghijk,字串2為abcde,則字串1包含字串2,因為字串2中包含的字母在字串1中也都有。

(3)解決方案:

思路一

最直接的思路就是針對字串2中的每個字元,輪詢字串1進行比較,看是否在字串1裡面。很明顯這種的時間效率為o(n*m)。

#include

#include

using

namespace

std;

void compare(string long_str, string short_str)

} if(j == long_str.size())

} cout

<< "true"

<< endl;

return;

} int main()

思路二

這裡由於假定了字串只包含字母,所以我們可以用乙個額外的陣列flag[26]作為26個字元標識位,先遍歷長字串將對應的標識位置1,再遍歷短字串,如果對應的標示位都是1,則包含;否則不包含。這種方法的時間複雜度為o(n+m),為了提高空間效率,這裡不使用陣列而使用26個bit位來作為標示位(bitset容器)。

#include

#include

#include

using

namespace

std;

bool compare(string long_str, string short_str)

for(int i=0; i// flag.test(n)判斷第n位是否為1

if(!flag.test(short_str[i]-'a'))

return

false;

} return

true;

} int main()

這種方法還可以進行優化,例如如果長字串的字首就為短字串,那麼我們可以不需要n+m次,而只需要2m次。具體實現請自己思考。

思路三

給每個字母分配乙個素數,從2開始到3,5,7…遍歷長字串,求得每個字元對應素數的乘積。然後遍歷短字串,判斷該乘積能否被短字串中的字元對應的素數整除,如果除的結果存在餘數,則說明有不匹配的字母;如果整個過程都沒有餘數,則說明短字串中的字母在長字串裡都有。這種方法的時間複雜度也是o(n+m),需要26個額外空間存素數,但是這種方法有乙個缺點就是需要跟大整數打交道,因為乘積可能非常大。(這裡我們使用標頭檔案中定義的int64_t和uint64_t)

#include

#include

#include

//#include// c++11

using

namespace

std;

bool compare(string long_str, string short_str)

; /* int64_t和uint64_t分別表示64位的有符號和無符號整形數 */

/* 在不同位數機器的平台下通用,都是64位 */

uint64_t ch = 1;

for(int i=0; i'a'];

} for(int i=0; iif(ch%primenum[short_str[i]-'a'] != 0)

return

false;

} return

true;

} int main()

字串包含問題

字串包含問題 判斷小字串的所有字元是否大字串都有 思路一 針對小字串的每乙個字元一一與大字串的字元輪詢比較即可,很明顯時間複雜度為o n m bool compare string s1,string s2 if j s2.length return true 思路二 對兩個字串分別排序,同時依次輪...

字串包含問題

假設這有乙個各種字母組成的字串a,和另外乙個字串b,字串裡b的字母數相對少一些。什麼方法能最快的查出所有小字串b裡的字母在大字串a裡都有?比如,如果是下面兩個字串 string 1 abcdefghlmnopqrs string 2 dcgsrqpo 答案是true,所有在string2裡的字母st...

字串包含問題

兩個字串s1和s2,假設s1長度大於等於s2長度,判斷s2是否為s1的乙個子集。例如 s1 abcdefghi,s2 acefg,由於s2中的每個元素都出現在s1中,說明s1包含s2.若s2 acefgk,由於k不在s1中,因此s1不包含s2。設s1長度為m,s2長度為n 方法1 brute for...