115 不同的子串行

2022-07-03 10:03:11 字數 1812 閱讀 4289

給定乙個字串s和乙個字串t,計算在s的子串行中t出現的個數。

字串的乙個 子串行 是指,通過刪除一些(也可以不刪除)字元且不干擾剩餘字元相對位置所組成的新字串。(例如,"ace""abcde"的乙個子串行,而"aec"不是)

題目資料保證答案符合 32 位帶符號整數範圍。

示例 1:

輸入:s = "rabbbit", t = "rabbit"輸出3解釋:

如下圖所示, 有 3 種可以從 s 中得到"rabbit" 的方案

(上箭頭符號 ^ 表示選取的字母)rabbbit^^^^ ^^rabbbit^^ ^^^^rabbbit^^^ ^^^

示例 2:

輸入:s = "babgbag", t = "bag"輸出5解釋:

如下圖所示, 有 5 種可以從 s 中得到"bag" 的方案

(上箭頭符號 ^ 表示選取的字母)babgbag^^ ^babgbag^^ ^babgbag^ ^^babgbag^ ^^babgbag^^^

brute force

tle

class

solution:

def numdistinct(self, s: str, t: str) ->int:

res=0

comb=itertools.combinations(s,len(t))

for i in

comb:

i=''

.join(i)

if i==t:

res+=1

return res

then let's try dp

dp[i][j] 表示s中範圍是 [0, i] 的子串中能組成t中範圍是 [0, j] 的子串的子串行的個數

分析例子

r a b b b i t

1 1 1 1 1 1 1 1

r 0 1 1 1 1 1 1 1

a 0 0 1 1 1 1 1 1

b 0 0 0 1 2 3 3 3

b 0 0 0 0 1 3 3 3

i 0 0 0 0 0 0 3 3

t 0 0 0 0 0 0 0 3

總結規律 就出來了

class

solution:

def numdistinct(self, s: str, t: str) ->int:

m,n=len(s),len(t)

dp=[[0]*(m+1) for i in range(n+1)]

for i in

range(m):

dp[0][i]=1

for i in range(1,n+1):

for j in range(1,m+1):

if t[i-1]==s[j-1]:

dp[i][j]=dp[i][j-1]+dp[i-1][j-1]

else

: dp[i][j]=dp[i][j-1]

return

dp[n][m]

115 不同的子串行

題目.high dp用熟了反而覺得簡單了。s字串增加乙個字元,要麼這個字元與t的最後乙個字元相同,要麼不相同 package main import fmt func numdistinct s string t string int iflen t 0 dp make int len s 1 fo...

領扣 115 不同的子串行

給定乙個字串 s 和乙個字串 t,計算在 s 的子串行中 t 出現的個數。乙個字串的乙個子串行是指,通過刪除一些 也可以不刪除 字元且不干擾剩餘字元相對位置所組成的新字串。例如,ace 是 abcde 的乙個子串行,而 aec 不是 我的 static int x class solution fo...

leetcode 115 不同的子串行

思路 動態規劃 狀態定義 f x,y 記t中 0,x 範圍的子串為t 記s中 0,y 範圍的子串為s f x,y 表示在s 中t 出現的個數。狀態轉移 1 對於x 0的情況,a 當y 0時,如果s.charat 0 t.charat 0 則f 0,0 1 否則f 0,0 0。b 當y 0 時,如果s...