題目描述
給定兩個分別由字母組成的字串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.串的順...