乐扣139单词拆分

问题描述 :

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

说明:

拆分时可以重复使用字典中的单词。

你可以假设字典中没有重复的单词。

示例 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

思路:
从字符串s中截取一段字符串word,判断word是否为wordDict里的单词,若是,则标记为true
新建一个vector< bool >dp(len+1,false)
dp[i] 表示第 i 个字符前,所有的字符是否可以按字典拆分成单词
其中第 i - 1 个字符是上一个词的结尾字母,第 i 个字符是一个新词的开头字母
初始值 dp[0] = true ,表示第 0 个字符是一个新词的开头字母
所求的答案为 dp[s.size()] ,表示这个字符串是否可以拆分成字典中的单词

另外:
s.substr(i).find(word) //表示从s字符串的第i位开始截取一直到最后一位,这个新截取的字符串里是否能找到word,若找得到则返回首次出现的第一个字符的位置
即用s.substr(i).find(word) ==0 来判断

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
class Solution {
     
public:
    bool wordBreak(string s, vector<string>& wordDict) {
     
        int len=s.size();
        vector<bool>dp(len+1,false);
        dp[0]=true;
        for(int i=0;i<len;i++){
     
            if(dp[i]==false)
                continue;
            for(string &word : wordDict){
     
                if(s.substr(i).find(word)==0)
                    dp[i+word.size()]=true;
            }
        }
        return dp[len];
    }
};
int main()
{
     
    vector<string>wordDict;
    string s;
    cin>>s;
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
     
        string b;
        cin>>b;
        wordDict.push_back(b);
    }
    bool res=Solution().wordBreak(s,wordDict);
    cout<<(res?"true":"false")<<endl;
    return 0;
}

你可能感兴趣的:(LeetCode)