LeetCode139. 单词拆分 每日一题6月25日

问题描述:

给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。

说明:

拆分时可以重复使用字典中的单词。
你可以假设字典中没有重复的单词。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/word-break

示例 1:

输入: s = "leetcode", wordDict = ["leet", "code"]
输出: true
解释: 返回 true 因为 "leetcode" 可以被拆分成 "leet code"。

示例 2:

输入: s = "applepenapple", wordDict = ["apple", "pen"]
输出: true
解释: 返回 true 因为 "applepenapple" 可以被拆分成 "apple pen apple"。
     注意你可以重复使用字典中的单词。

示例 3:

输入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
输出: false

解题思路:

动态规划

先将字符串数组存入unorder_set中,

然后双层循环

判断字符串i~j这部分能否能在set中找到,并且还要判断前0·i部分能被切分

class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) {
        vector<bool> dp(s.size()+1,false);
        unordered_set<string> m(wordDict.begin(),wordDict.end());
        dp[0] = true;

        int minlen = INT_MAX;
        int maxlen =0;
        for(auto &str:wordDict){
            minlen = min(minlen, (int)str.size());
            maxlen = max(maxlen, (int)str.size());
        }
        for(int i=minlen;i<=s.size();i++){
            for(int j=max(0,i-maxlen);j<i;j++){
                if(dp[j]&&m.find(s.substr(j,i-j))!=m.end()){
                    dp[i] = true;
                    break;
                }
            }
        }
        return dp[s.size()];
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章