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

2021-10-13 03:02:02 字數 1807 閱讀 5201

給定乙個字串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 這道題最容易想到的方...