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


//===============================================================
//FileName:
//          倒置.cpp
//Date:
//          2019/12/4
//Author:
//          khoing(https://blog.csdn.net/qq_45391763)
//===============================================================


#include 
#include 

using namespace std;

bool wordBreak(string s, vector<string>& wordDict) {



	vector<bool> dp(s.size() + 1, false);//加上空字符串
	dp[0] = true; //这是因为空字符串总是vector的一部分。数组剩余的元素都初始化为false 。
	for (int i = 1; i <= s.size(); i++) //i表示所有从当前字符串开始的可能的子字符串,i为1开始,第一个字符和空字符串是否都是字典的一部分
	{
		for (int j = 0; j < i; j++)//通过下标 j 将它拆分成 s1'和 s2' ,i 现在指向 s2'的结尾
		{
			//dp[j] 记录了j左边的字符串是否是字典的一部分,如果满足,接下来检查 s2'是否在字典中
			if (dp[j] && find(wordDict.begin(), wordDict.end(), s.substr(j, i - j)) != wordDict.end())
			{
				//我们依次检查每个dp[j] 是否为true ,也就是子字符串 s1'是否满足题目要求
				//加入i为2,有两个字符,首先拆分为0个字符和2个字符,0是字典的一部分成立,2检查是否在字典中,若不在就拆分为1个字符和另外一个字符,依次检查是否是字典的一部分
				//如果有一个满足,拆分的字符串都是字典的一部分,则表明这个两个字符串满足要求,i为2时,dp为true

				//如果是,则表示前i个字符拆分的字符串是字典的一部分
				dp[i] = true;
				break;
			}
		}
	}
	return dp[s.size()];如果true,则表示前i个字符(整个字符串)拆分的字符串是字典的一部分

}

int main(){
	vector<string> v{ "a","b","bbb","bbbb"};
	cout<<wordBreak("bb", v);
}


你可能感兴趣的:(LeetCode)