C 「視窗」法尋找子串

2021-10-06 19:13:31 字數 1520 閱讀 5342

給定長度為m的字串aim,以及乙個長度為n的字串str

問能否在str中找到- -個長度為m的連續子串, 使得這個子串剛好由aim的m個字元組成,順序無所謂, 返回任意滿足條件的乙個子串的起始位置,未找到返回-1

找到str中所有字串substr,比較substr與aim是否成分相同(字母的種類和數量一致)

遍歷所有可能的字串長度通過視窗:欠與還

//比較與aim長度相同的的所有子串是否含有與它成分一致,若有,返回偏移量,否則返回-1

intfindaim

(string str, string aim)

;for

(int i =

0; i < aim.

length()

; i++

) substr = str.

substr

(i, aim.

length()

);findaim =

true

;for

(int i =

0; i < aim.

length()

; i++)if

(findaim ==

true

)return i;

}return-1

;}

//比較與aim長度相同的的所有子串是否含有與它成分一致,若有,返回偏移量,否則返回-1

//法2:最優解,通過「視窗」

intfindaim2

(string str, string aim)

;int

* pcnt = count +97;

for(

int i =

0; i < aim.

length()

; i++

) count[aim[i]]++

;//記錄視窗與aim的交易關係

//初始值是字元總長度

int owe = aim.

length()

;//初始化第乙個視窗

for(

int i =

0; i < aim.

length()

; i++)if

(owe ==0)

return0;

//移動「視窗」,每次移動:拿去乙個字元,新增乙個字元,共可移動str.length() - aim.length()次

//移除的字元是第i個,新增的字元是第i+aim.length()個

for(

int i =

0; i <= str.

length()

- aim.

length()

; i++

)return-1

;}

string generatearr

(int len,

int left,

int right)

return str;

}

尋找子串位置

給出字串a和字串b,保證b是a的乙個子串,請你輸出b在a中第一次出現的位置。輸入描述 input description 僅一行包含兩個字串a和b 輸出描述 output description 僅一行乙個整數 樣例輸入 sample input abcd bc 樣例輸出 sample output...

尋找最長公共子串

def find lcp s,t lens len s lent len t if not lens or not lent return 0 longest 0 for i in range lens for j in range lent length 0 m i n j while m len...

如何尋找最長回文子串

5.最長回文子串 回文串是面試常常遇到的問題 雖然問題本身沒啥意義 本文就告訴你回文串問題的核心思想是什麼。首先,明確一下什 回文串就是正著讀和反著讀都一樣的字串。比如說字串aba和abba都是回文串,因為它們對稱,反過來還是和本身一樣。反之,字串abac就不是回文串。可以看到回文串的的長度可能是奇...