(字串)子串變位詞
阿新 • • 發佈:2020-09-06
題目:
給定兩個串a和b,問b是否是a的子串的變位詞,例如輸入a=hello,b=lel,lle,ello都是true,但b=elo是false。(字串是連續的)
思路:
- 滑動視窗思想:動態維護一個“視窗”,比如b的長度是3,考察a[0..2],a[1..3],a[2..4]是否是b的變位詞,關鍵在於如何與b比較?
- hash陣列統計:基於字元的特殊性,可以用[0,255]的陣列來統計字元出現的次數,假設都是小寫的英文字母,則用[0,25]來表示b中每個單詞出現的次數,通過記錄非0次出現的個數nonZero。
- 視窗滑動,向右移動一位:
新視窗 a[i-lenb+1…i],舊視窗 a[i-lenb…i-1]
每次新視窗扔掉a[i-lenb],加入a[i]
#include <iostream> #include<vector> #include<string> using namespace std; bool variable_bit_word(string a,string b){ int lena = a.size(),lenb=b.size(); //首先把b存入陣列 vector<int> cnt(26); int nonzero = 0; for(inti=0;i<lenb;i++){ int c = b[i]-'a'; cnt[c]++; if(cnt[c] == 1) nonzero++; } //a的第一個視窗,長度lenb for(int i=0;i<lenb;i++){ int c = a[i] -'a'; cnt[c]--; if(cnt[c] == 0) nonzero--; if(cnt[c] == -1) nonzero++; }if(nonzero == 0) return true; //剩下的視窗,i是a視窗中最後一個字元位置 for(int i=lenb;i<lena;i++){ //去掉a[i-lenb],加上a[i] int c = a[i-lenb] - 'a'; cnt[c]++; if(cnt[c] == 0) nonzero--; if(cnt[c] == 1) nonzero++; c = a[i]-'a'; cnt[c]--; if(cnt[c] == 0) nonzero--; if(cnt[c] == -1) nonzero++; if(nonzero == 0) return true; } return false; } int main() { string a = "hello"; string b = "lol"; cout<<variable_bit_word(a,b); return 0; }