知識點:雙指標、動態規劃
題目
給定字串 s 和 t ,判斷 s 是否為 t 的子串行。
你可以認為 s 和 t 中僅包含英文小寫字母。字串 t 可能會很長(長度 ~= 500,000),而 s 是個短字串(長度 <=100)。
字串的乙個子串行是原始字串刪除一些(也可以不刪除)字元而不改變剩餘字元相對位置形成的新字串。(例如,"ace"是"abcde"的乙個子串行,而"aec"不是)。
示例1
輸入:
s = 「abc」, t = 「ahbgdc」
輸出:
true
示例2
輸入:
s = 「axc」, t = 「ahbgdc」
輸出:
false
後續挑戰
如果有大量輸入的 s,稱作s1, s2, … , sk 其中 k >= 10億,你需要依次檢查它們是否為 t 的子串行。在這種情況下,你會怎樣改變**?
解法
雙指標遍歷比較簡單
**
#include
#include
#include
using
namespace std;
class
solution
return i==len1;}}
;int
main()
後續挑戰:
動態規劃
當字串s的數量比較大的時候,需要一次次遍歷字串t
可以用f[i][j]表示從第i個下標開始(包括i),第一次出現字元j的下標是什麼
狀態轉移方程:
如果在這個位置中的字元就是j,則f[i][j]=i
如果在這個位置中的字元不是j,j出現的位置還要往後f[i][j] = f[i+1][j]
需要從後往前遍歷,因為前面的值需要依靠後面的來定
注意邊界
f[t.length()] = t.length() 做乙個標記,從位置t.length-1的位置不存在任何字元
#include
#include
#include
using
namespace std;
class
solution
// 對t倒著打表,對t只需要處理一次
for(
int i = len2 -
1; i >=
0; i--)}
int add =0;
for(
int i =
0; i < len1; i++
) add = f[add]
[s[i]
-'a']+
1;/}
return
true;}
};intmain()
今天也是愛zz的一天哦!
LeetCode刷題之392 判斷子串行
我不知道將去向何方,但我已在路上!十六進製制中所有字母 a f 都必須是小寫。十六進製制字串中不能包含多餘的前導零。如果要轉化的數為0,那麼以單個字元 0 來表示 對於其他情況,十六進製制字串中的第乙個字元將不會是0字元。給定的數確保在32位有符號整數範圍內。不能使用任何由庫提供的將數字直接轉換或格...
LeetCode刷題日記 392 判斷子串行
題目給出乙個短字串s和乙個長字串t,要求判斷s是否為t的子串行。子串行的定義為,母序列在刪去一些字元後,在不改變順序的情況下,可以變得與子串行完全一致。首先的想法是生成乙個s下標,賦值為0,在長字串中尋找第乙個下標的值,如果能找到,則下標向後移動一位。如果全能找到,則會退出迴圈,下標與s長度相等。如...
Leetcode刷題筆記
1.兩數之和給定乙個整數陣列nums 和乙個目標值target,請你在該陣列中找出和為目標值的那兩個整數,並返回他們的陣列下標。ps 你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。思路 用target減去nums中的每乙個數,並設立乙個字典來記錄對應的下標 class...