0
点赞
收藏
分享

微信扫一扫

139. 单词拆分

萧萧雨潇潇 2022-03-16 阅读 73

题目描述:

分析:

        这道题不怎么会,我想的方法太麻烦,还不对,就不献丑了,直接说看了题解的想法吧。

        题解用了dp,dp[i]=true 代表s[0]~s[i+1]这部分子字符串是可以由wordDict中的单词拼接而成的

        预先把wordDict中的所有单词存入hash表map

        因此,s是否可以由wordDict中的单词组成,可以换个角度思考,如果存在一个点j,使得dp[j]=true,即s[0]~s[j]可以由wordDict中的单词组成。而剩下的s[j]-s[n]组成的单词如果能在hash表map中找到,则s就可以判定为是可以由wordDict中的单词组成的。

用公式表达,就是:dp[j]&&ss.find(s.substr(j,i-j))!=ss.end()

而dp[j]可以使用同样的方法计算得出。

题解链接:

https://leetcode-cn.com/problems/word-break/solution/dan-ci-chai-fen-by-leetcode-solution/

代码如下:

class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) {
        // 定义set集合ss,用来存储worwordDict中的所有单词
        set<string> ss;
        for(int i=0;i<wordDict.size();i++)
            ss.insert(wordDict[i]);
        // dp[i]=true 代表s[0]~s[i+1]这部分子字符串是可以由wordDict中的单词拼接而成的
        // dp[1]-dp[s.size()]对应s[0]-s[s.size()-1]
        bool dp[305];
        // 初始化所有dp均为false
        for(int i=0;i<300;i++)
            dp[i]=false;
        // dp[0]初始化为true
        dp[0]=true;
        // 注意,dp[i]对应s[i-1] 
        // 遍历s
        for(int i=1;i<=s.size();i++)
        {
            // 依次从0遍历到i-1,来寻找s[0]~s[i-1]之间可能的分割点
            for(int j=0;j<i;j++)
            {
                // 以j为分割点,s的子串划分为s[0]~s[j-1]和s[j]~s[i]
                string temp=s.substr(j,i-j);
                // 如果s[0]~s[j-1]可以由wordDict中的单词拼接而成
                // 而且s[j]~s[i]也对应wordDict中的某个单词
                // 则说明s的子串s[0]~s[i] 是可以由wordDict中的单词拼接而成的 将dp[i]记为true
                if(dp[j]&&ss.find(s.substr(j,i-j))!=ss.end())
                dp[i]=true;
            }
        }
        // 返回结果 dp[s.size()]表示s[0]~s[s.size()-1]是否能由wordDict中的单词拼接而成
        return dp[s.size()];
    }
   
};

 

举报

相关推荐

0 条评论