給定字串 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 ...