给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。
说明:
拆分时可以重复使用字典中的单词。
你可以假设字典中没有重复的单词。
示例 1:
示例 2:
示例 3:
//===============================================================
//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);
}