力扣-139-单词拆分

传送门

题目分析:判断一个字符串能否能否被字典中的短串划分,可以采用动态规划的思想。令$dp[i]$表示

字符串的前$i$个字符组成的字符串$s[0..i-1]$能否被空格拆分为若干个字典中出现的单词。判断$dp[i]$时

,我们要枚举$0..i-1$中的分割点$j$,看$s[0..j-1]$组成的字符串$s1$和$s[j..i-1]$组成的字符串s2是否

都合法,如果两个字符串均合法,那么按照定义,他们拼接成的字符串也同样合法。由于$dp$是从

前往后遍历的,故可以列出状态转移方程:dp[i] = dp[j] && check(j..i-1)其中$check(j..i-1)$表示

检查$s串中$第$j$到第$j-1$的字符串是否出现在字典中,这里可以用Map来实现。

class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) {
        //hash判断字符串是否存在于字典
        map<string, int> Hash;
        for(auto word: wordDict){
            Hash[word] = 1;
        }
        
        int len = s.length();
        vector<bool> dp(len + 1); //dp[i]表示前i个字符串是否合理
        dp[0] = true;
        for(int i = 1; i <= len; i++) {
            for(int j = 0; j < i; j++) {
                if(dp[j] && Hash[s.substr(j, i - j)]) {
                    dp[i] = true;
                    break;
                }
            }            
        }
        return dp[len];
    }
};

 

posted @ 2020-08-04 11:37  Peterxiazhen  阅读(134)  评论(0编辑  收藏  举报