不同子串行

2021-10-08 20:00:09 字數 1413 閱讀 2551

難度:hard

備註:出自leetcode

題目描述

package 不同子串行;

/** * @version 1.0

* @date 2020/8/3 16:28

*//**

* 題目描述:

* 給定兩個字串s和t,求s有多少個不同的子串與t相同。

* s的子串定義為在s中任意去掉0個或者多個字元形成的串。

* 子串可以不連續,但是相對位置不能變。

* 比如「ace」是「abcde」的子串,但是「aec」不是。

* 問題翻譯:

* s有多少個不同的子串與t相同

* s[1:m]中的子串與t[1:n]相同的個數

* 由s的前m個字元組成的子串與t的前n個字元相同的個數

* 狀態:

* 子狀態:由s的前1,2,...,m個字元組成的子串與t的前1,2,...,n個字元相同的個數

* f(i,j): s[1:i]中的子串與t[1:j]相同的個數

* 狀態遞推:

* 在f(i,j)處需要考慮s[i] = t[j] 和 s[i] != t[j]兩種情況

* 當s[i] = t[j]:

* 1>: 讓s[i]匹配t[j],則

* f(i,j) = f(i-1,j-1)

* 2>: 讓s[i]不匹配t[j],則問題就變為s[1:i-1]中的子串與t[1:j]相同的個數,則

* f(i,j) = f(i-1,j)

* 故,s[i] = t[j]時,f(i,j) = f(i-1,j-1) + f(i-1,j)

* 當s[i] != t[j]:

* 問題退化為s[1:i-1]中的子串與t[1:j]相同的個數

* 故,s[i] != t[j]時,f(i,j) = f(i-1,j)

* 初始化:

* 引入空串進行初始化

* f(i,0) = 1 ---> s的子串與空串相同的個數,只有空串與空串相同

* 返回結果:

* f(m,n)

*/public

class

solution

for(

int i =

0; i <= row; i++

)for

(int i =

1; i <= row; i++

)else}}

return numdis[row]

[col];}

}

不同的子串行

leetcode 給定乙個字串 s 和乙個字串 t,計算在 s 的子串行中 t 出現的個數。乙個字串的乙個子串行是指,通過刪除一些 也可以不刪除 字元且不干擾剩餘字元相對位置所組成的新字串。例如,ace 是 abcde 的乙個子串行,而 aec 不是 題目資料保證答案符合 32 位帶符號整數範圍。示...

32 不同的子串行

題目描述 給定乙個字串 s 和乙個字串 t,計算在 s 的子串行中 t 出現的個數。乙個字串的乙個子串行是指,通過刪除一些 也可以不刪除 字元且不干擾剩餘字元相對位置所組成的新字串。例如,ace 是 abcde 的乙個子串行,而 aec 不是 示例 1 輸入 s rabbbit t rabbit 輸...

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...