給定乙個字串s
,計算s
的不同非空子序列的個數。
因為結果可能很大,所以返回答案模10^9 + 7
.
示例 1:
輸入:"abc"
輸出:7
解釋:7 個不同的子串行分別是 "a", "b", "c", "ab", "ac", "bc", 以及 "abc"。
示例 2:
輸入:"aba"
輸出:6
解釋:6 個不同的子串行分別是 "a", "b", "ab", "ba", "aa" 以及 "aba"。
示例 3:
輸入:"aaa"
輸出:3
解釋:3 個不同的子串行分別是 "a", "aa" 以及 "aaa"。
優化子結構就是證明原問題的最優解包含子問題的最優解,或者可以通過子問題的最優解構造原問題的最優解,下面說明如何由子問題的解來構造原問題的解。
優化子結構:設 dp[
k]
dp[k]
dp[k
] 表示字串 s[0
,...
,k
]s[0,...,k]
s[0,..
.,k]
的不同子串行的個數,對於每乙個位置 k
kk,dp[
k]
dp[k]
dp[k
] 可以由子問題的解構造得到:
該問題的優化子結構不容易證明,但從子問題的解構造原問題的解的角度去思考還是比較容易的。
重疊子問題:存在。
遞迴地定義最優解的值:優化子結構是通過子問題,考慮到在有重複字元出現時,下標 dp[
last
[s[k
]]−1
]dp[last[s[k]]-1]
dp[las
t[s[
k]]−
1]可能是負數,因此這裡初始化 dpdp
dp陣列大小為 n+1
n+1n+
1,其中 n
nn 表示字串的字元個數,dp[
k+1]
dp[k+1]
dp[k+1
] 表示字串 s[0
,...
,k
]s[0,...,k]
s[0,..
.,k]
中不同子串行的個數:
自底向上地計算最優解的值:從左向右掃瞄字串的每個字元 s[k
]s[k]
s[k]
,便可以保證計算每乙個 dp[
k+1]
dp[k+1]
dp[k+1
] 時,其相關的子問題 dp[
k]
dp[k]
dp[k
] 以及 dp[
last
[s[k
]]
]dp[last[s[k]]]
dp[las
t[s[
k]]]
均已經被計算了出來。
class
solution
dp[i+1]
%= m;
last[ch]
= i;
}return dp[n]
<
0? dp[n]
+ m : dp[n];}
};
不同的子串行 動態規劃
題目鏈結 思路 將兩個字串從右向左進行遍歷 s i 表示s串中從下標 i 開始到末尾的字串 t j 表示t串中從下標 j 開始到末尾的字串。例如 rara 與 ra 首先都是從末尾的a開始遍歷,若此時 i 0 j 0,代表 rara 與 ra 匹配的情況,且 r r 匹配,那麼此時有兩種情況 將 r...
動態規劃(二)最長回文子串行
所說的子串行不一定是連續的,但是順序不變。子串必須是連續的字元組成。最優子結構 假設s i j 是給定的字串,長度為n,讓dp i j 表示從s i 到s j 包含的最長回文子串行的長度。初始化 dp i i 1 如果s i s j dp i j dp i 1 j 1 2 如果s i s j dp ...
不同的子串行(leetcode hard)動態規劃
題目 給出字串s和字串t,計算s的不同的子串行中t出現的次數。子串行字串是原始字串通過刪除一些 或零個 產生的乙個新的字串,並且對剩下的字元的相對位置沒有影響。比如,ace 是 abcde 的子串行字串,而 aec 不是 樣例 給出s rabbbit t rabbit 返回 3 這道題最容易想到的方...