单词拆分(LeetCode 139)

题意

这个题意要理解透了才行,转换成我自己理解的题意:

有一个字符串s,还有一个单词字典wordDict,问题的关键是能否用wordDict里的单词组合出字符串s。

思路

这个题可以使用动态规划来解决。动态规划最重要的是状态的定义,好的状态定义能够使解题非常简便。

状态定义:
\(dp[i]\):长度为i的字符串能否拆成wordDict里边的单词组合

状态转移方程:
\(dp[i] = dp[j] && substr(j, i) in wordDict, (0 <= j < i)\)

初始状态:
\(dp[0] = true\)

代码

class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) {
        vector<int> dp(s.size()+1, 0);
        dp[0] = 1;
        unordered_set<string> st(wordDict.begin(), wordDict.end());
        for(int i = 1; i <= s.size(); i++)
        {
            for(int j = 0; j < i; j++)
            {
                auto pos = st.find(s.substr(j, i-j));
                if(dp[j] && pos != st.end())
                {
                    dp[i] = 1;
                    break;
                }
            }
        }
        return dp[s.size()];
    }
};

// dp(i) : 长度为i的字符串能否拆成wordDict中的一系列字串
// dp(i) : dp(j-1) && s[j, i] in wordDict
// dp(0) = 0

posted @ 2020-03-20 15:17  美不胜收  阅读(401)  评论(0)    收藏  举报