題目:給出字串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 輸...