不同的子串行(leetcode hard)動態規劃

2021-07-15 13:57:25 字數 1198 閱讀 3164

題目:給出字串s和字串t, 計算s的不同的子串行中t出現的次數。

子串行字串是原始字串通過刪除一些(或零個)產生的乙個新的字串,並且對剩下的字元的相對位置沒有影響。(比如,「ace」

是「abcde」

的子串行字串,而「aec」

不是)。 樣例

給出s = "rabbbit"

, t ="rabbit"

返回 3

這道題最容易想到的方法就是萬能的搜尋 dfs ,如果如果s中發現了與t中相同的字元,則去掉s中的此字元,並搜尋餘下的t

看**可能更容易懂

public int numdistinct(string s, string t) 

if (t.length() == 0)

int cnt = 0;

for (int i = 0; i < s.length(); i++)

}return cnt;

}

搜尋雖然比較容易想到,但是效率會比較低下;此類問題應該用動態規劃解決,此題動態規劃狀態轉移方程不是很容易想出來

dp[0][0] = 1; // t和s都是空串.

dp[0][1 ... s.length() - 1] = 1; // t是空串,s只有一種子串行匹配。

dp[1 ... t.length() - 1][0] = 0; // s是空串,t不是空串,s沒有子串行匹配。

dp[i][j] = dp[i][j - 1] + (t[i - 1] == s[j - 1] ? dp[i - 1][j - 1] : 0).1 <= i <= t.length(), 1 <= j <= s.length()

推出狀態轉移方程後,動規問題就非常簡單了, 主要注意邊界條件處理就ok了

public int numdistinct(string s, string t) 

int slen = s.length();

int tlen = t.length();

int count = new int[slen + 1][tlen + 1];

for (int i = 0; i <= slen; i++)

for (int i = 1; i <= slen; i++) }}

return count[slen][tlen];

}

不同的子串行

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

不同子串行

難度 hard 備註 出自leetcode 題目描述 package 不同子串行 version 1.0 date 2020 8 3 16 28 題目描述 給定兩個字串s和t,求s有多少個不同的子串與t相同。s的子串定義為在s中任意去掉0個或者多個字元形成的串。子串可以不連續,但是相對位置不能變。比...

32 不同的子串行

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