資料結構學習筆記2 字串包含(快速排序和雜湊表)

2021-07-04 11:12:17 字數 2116 閱讀 5469

題目描述

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

這裡只介紹兩種較好地方法:

解法1:

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

void swap(char *s,long i,long j)//字串的裡面的單個字元交換函式

/*** 將傳入的字元陣列s根據選取的主元來分成三部分,參考《演算法導論》96頁

* * @param s 傳入的字元陣列指標

* @param lo 需要處理的字元陣列首下標

* @param hi 需要處理的字元陣列的末下標

* * @return 主元x最後所在的下標

*/unsigned long parttion(char *s,long lo,long hi)//hi傳入的是最後乙個字串(不是'\0')對應的下標的數字

}swap(s,i+1,hi);//最後還要將主元交換一次

return i+1;

}void quicksort(char *s,long lo,long hi)

}bool comparestring(char *longs,char *shorts)

}for (int j=0; jif (j>0)

}if (*(longs+j)!=*(shorts+i))

continue;

}break;}}

return

true;

}int main(int argc, const

char * argv)

else

return

0;}

解法2:

上述方案中,較好的方法是先對字串進行排序,然後再線性掃瞄,總的時間複雜度已經優化到了:o(m+n),貌似到了極限,還有沒有更好的辦法列?

我們可以對短字串進行輪詢(此思路的敘述可能與網上的一些敘述有出入,因為我們最好是應該把短的先儲存,那樣,會降低題目的時間複雜度),把其中的每個字母都放入乙個hashtable裡(我們始終設m為短字串的長度,那麼此項操作成本是o(m)或8次操作)。然後輪詢長字串,在hashtable裡查詢短字串的每個字元,看能否找到。如果找不到,說明沒有匹配成功,輪詢長字串將消耗掉16次操作,這樣兩項操作加起來一共只有8+16=24次。

當然,理想情況是如果長字串的字首就為短字串,只需消耗8次操作,這樣總共只需8+8=16次。

#include

#include

int main()

;//自己定義的雜湊表,因為有26個字母,所以是26!

int num=0;//計算雜湊表中1的個數

for(int j=0;j < strlen(str2);j++)

}for(int k=0;kint

index=str1[k]-'a';

if(hash[index]==1)

}if(num==0)

printf("true\n");

else

printf("false\n");

return

0;}

本文參考**:

《程式設計師程式設計藝術:第二章、字串是否包含問題》

《十一、從頭到尾徹底解析hash 表演算法》

資料結構學習筆記(一) 字串的模式匹配

參考 北京大學資料結構與演算法c 已有乙個目標字串t,給定模式p,在目標字串t中搜尋與模式p全同的乙個字串,並求出t中與p全同匹配的字串 簡稱為配串 並返回其首字元位置 例如 在字串 hello world 中找到 llo 並返回l 利用窮舉法,逐個字元後移匹配,如果該次匹配失敗,則需要首字元後移到...

資料結構3 字串

string的基本操作函式要會,拷貝,查詢 hw筆試第一題,兩個字串,前面是全量字符集,後面是已占用字符集 用 隔開 輸出剩餘的字符集。1 include2 include3 using namespace std 4string stringoperate string str1,string s...

資料結構學習筆記(串)

串的定義 1.串 串是由零個或多個字元組成的有限序列,又名叫字串。2.串的比較 串的長度以及它們各個對應位置的字元都相等時,才算相等。給定兩個串 s a1a2.an t b1b2 bm 當滿足以下條件之一時,s 3.串中更多的是查詢字串位置 得到指定位置字串 替換子串等操作。串的儲存結構 1.串的順...