ETH官方钱包

前往
大廳
主題

LeetCode - 2707. Extra Characters in a String 解題心得

Not In My Back Yard | 2024-07-27 12:00:09 | 巴幣 0 | 人氣 76

題目連結:


題目意譯:
你被給定一個索引值從 0 開始數的字串 s 以及一個字典 dictionary。你需要將 s 分切成一個或多個不重疊的子字串使得每一個子字串都出現於字典之中。在 s 中可能會留下若干個不包含在任一個子字串中的多餘字元。

回傳在以最佳方式分切 s 的情況下,將會剩下的最少字元數。

限制:
1 ≦ s.length ≦ 50
1 ≦ dictionary.length ≦ 50
1 ≦ dictionary[i].length ≦ 50
dictionary[i] 和 s 只由小寫英文字母組成。
dictionary 中的字詞彼此相異。



範例測資:
範例 1:
輸入: s = "leetscode", dictionary = ["leet","code","leetcode"]
輸出: 1
解釋: 我們可以將 s 分切成兩個子字串:索引值 0 到 3 的 "leet" 以及索引值 5 到 8 的 "code"。只會有 1 個沒有用到的字元剩下(位於索引值 4),所以我們回傳 1。

範例 2:
輸入: s = "sayhelloworld", dictionary = ["hello","world"]
輸出: 3
解釋: 我們可以將 s 分切成兩個子字串:索引值 3 到 7 的 "hello" 以及索引值 8 到 23 的 "world"。位於索引值 0 、 1 、 2 的字元沒有在任何子字串中被用到,所以我們回傳 3。


解題思維:
(令 n = s.length)
普通的動態規劃(Dynamic Progarmming)題型。

定義一個陣列 D,其中 D[i] 代表著 s[i] ~ s[n - 1] 在最佳的分切情況下最少會剩多少字元沒有用到。可以看到其遞迴式為:
    D[n] = 0
    D[i] = min(D[j + 1]),其中 i ≦ j < n 且 s[i] ~ s[j] 所形成的子字串存在於 dictionary 中。

可以看到所求即為 D[0] 之值。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作