392 判斷子串行

2021-10-08 13:35:41 字數 912 閱讀 6046

給定字串 s 和 t ,判斷 s 是否為 t 的子串行。

你可以認為 s 和 t 中僅包含英文小寫字母。字串 t 可能會很長(長度 ~= 500,000),而 s 是個短字串(長度 <=100)。

字串的乙個子串行是原始字串刪除一些(也可以不刪除)字元而不改變剩餘字元相對位置形成的新字串。(例如,"ace"是"abcde"的乙個子串行,而"aec"不是)。

雙指標的思路很容易想到,用兩個指標分別指向s和t,字元相同時都前進一步,否則t字串的指標前進,如果到結束s的指標還沒移動到結尾,證明無法匹配。

class

solution

t_index++;}

return s_index == s.

size()

;}};

思考題假定了s的數量很大,如果每次都使用雙指標方法,時間都消耗在t上尋找匹配字元了,需要對t字串進行預處理操作,令dp[i][j]表示t字串中從位置i開始往後第一次出現字元j的位置。

當t[i]就是字元j時,dp[i][j]=i,否則字元j出現的位置在i+1往後,故dp[i][j]=dp[i+1][j]。

邊界條件,dp[m][j]=m,表示從位置m往後不可能出現字元j。

class

solution

for(

int i = m -

1; i >=

0; i--

)else}}

int odd =0;

for(

int i =

0; i < n; i++

) odd = dp[odd]

[s[i]

-'a']+

1;}return

true;}

};

392 判斷子串行

給定字串 s 和 t 判斷 s 是否為 t 的子串行。你可以認為 s 和 t 中僅包含英文小寫字母。字串 t 可能會很長 長度 500,000 而 s 是個短字串 長度 100 字串的乙個子串行是原始字串刪除一些 也可以不刪除 字元而不改變剩餘字元相對位置形成的新字串。例如,ace 是 abcde ...

392 判斷子串行

給定字串s和t,判斷s是否為t的子串行。你可以認為s和t中僅包含英文小寫字母。字串t可能會很長 長度 500,000 而s是個短字串 長度 100 字串的乙個子串行是原始字串刪除一些 也可以不刪除 字元而不改變剩餘字元相對位置形成的新字串。例如,ace 是 abcde 的乙個子串行,而 aec 不是...

392 判斷子串行

給定字串 s 和 t 判斷 s 是否為 t 的子串行。你可以認為 s 和 t 中僅包含英文小寫字母。字串 t 可能會很長 長度 500,000 而 s 是個短字串 長度 100 字串的乙個子串行是原始字串刪除一些 也可以不刪除 字元而不改變剩餘字元相對位置形成的新字串。例如,ace 是 abcde ...