1. 程式人生 > 實用技巧 >(字串)子串變位詞

(字串)子串變位詞

題目:

給定兩個串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(int
i=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; }