字串同源異構查詢

2021-10-05 02:46:36 字數 1784 閱讀 8802

字串同源異構

相同字元組成的,順序不一樣的字串。從乙個源字串中查詢子字串。要滿足子字串的字元,在源字元中順序存在,不能分割存在。如乙個是源string: caabcb 目標string: acabb 。源字元中aabcb就是目標字串(acabb )的同源異構體

構造視窗模式查詢

1、需要構建目標string: acabb的字串個數表。如欠債表:a=2,c=1,b=2

2、定義乙個目標視窗和目標字串一樣大小 以及是否找到了同源異構的flag,預設flag=0,可以找到滿足的同源異構體

2、第乙個視窗個數遍歷:從源來字串裡從頭遍歷,如果乙個字串出現在欠債表裡,則欠債表裡的相應字串的個數減一,如果該字元個數小於0,則flag加1。標示此時視窗中的該字元的個數比目標串的該字元個數多。第乙個視窗都是入窗的資料。

3、當第一1個遍歷完視窗[0…m-1]的大小的資料後,下乙個視窗遍歷是[1…m],

這是需要處理邏輯和第一次遍歷視窗的邏輯不一樣

第二次以及以後視窗向左邊移動的時候,如果進入視窗的字元,如果在欠債表裡該字元個數已經小於等於0了,那麼再進入視窗中,flag++(ps:標示比目標串中該字元又多1個)。欠債表裡的相應字串的個數減一。

從左邊出去的視窗資料[r-m] ,如果該字元的個數已經小於0,則flag–(ps:標示比目標串中該字元的個數可以少了乙個),欠債表裡該字串的個數+1.(ps:我已經出視窗了,不再比較了,原來減少的字元可以還原了)

**實現*

public

class

commparestring

public

intcommparestr

(string tarskstr,string orgstr )

//count[a]=2 count[c]=1 count[b]=2

//定義乙個目標視窗和目標字串一樣大小 以及是否找到了同源異構的flag,flag=0代表找到了,flag=整數則表示多餘字元,為負數,則缺少字元

//什麼叫欠債表呢

//從源來字串裡從頭遍歷,如果乙個字串出現在欠債表裡,則欠債表裡的相應字串的個數減一,如果個數小於0,則flag--

//當第一次遍歷完視窗[0...m-1]的大小的資料後,下乙個視窗遍歷是[1...m],

//這是需要處理邏輯和第一次遍歷視窗的邏輯不一樣

//第二次以及以後視窗向左邊移動的時候,如果進入視窗的字元,如果在欠債表裡已經<=0,那麼flag++,且欠債表裡的相應字串的個數減一

//從左邊出去的視窗資料[r-m] 以及<0,則flag--,則欠債表裡響應字串的個數+1

//進入視窗的字元,在欠債表裡個數-1,出去視窗的字元,在欠債表裡個數+1(ps:還給欠債表)

int m=tarskstr.

length()

;char org[

]=orgstr.

tochararray()

;int r=0;

int flag=0;

for(

;rfor(

;r(count[org[r-m]]++

<0)

}return flag==

0?r-m:-1

;}}

視窗的作用

視窗的大小和目標串一致。進入視窗的字元,從cout中減1,出去視窗的字元,從cout中加1。flag是比較器,如果flag++,標識欠目標串的。flag–,標識還給目標串的。最後如果flag==0,標識匹配到了。

204同分異構字串

兩次雜湊就對了,其實可以考慮就是出現相同字元的時候,看是不是同乙個字元也可以。注意是雙向的匹配。給定兩個字串 s 和 t,判斷它們是否是同構的。如果 s 中的字元可以被替換得到 t 那麼這兩個字串是同構的。所有出現的字元都必須用另乙個字元替換,同時保留字元的順序。兩個字元不能對映到同乙個字元上,但字...

字串查詢

問題描述 對於乙個給定的 source 字串和乙個 target 字串,你應該在 source 字串中找出 target 字串出現的第乙個位置 從0開始 如果不存在,則返回 1。解決思路 採用雙重for迴圈解決,思路清晰,較容易寫,但效率不高,另外一種方法是用kmp演算法,效率較高。需注意邊界條件,...

字串查詢

題目 對於乙個給定的 source 字串和乙個 target 字串,你應該在 source 字串中找出 target 字串出現的第乙個位置 從0開始 如果不存在,則返回 1。思路 很簡單,看 就能懂 python處理字元真的優勢很大 主要是注意一些細節 class solution param so...