Leetcode刷題筆記 392 判斷子串行

2021-10-08 14:17:23 字數 1682 閱讀 1603

知識點:雙指標、動態規劃

題目

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