leetcoe 139

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/artisans/article/details/88944545
给定一个非空字符串 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

class Solution {
public:
	bool wordBreak(string s, vector<string>& wordDict) {
		vector<int> dp(s.size(), -1);

		string s0(s.begin(), s.begin() + 1);
		dp[0] = std::find(wordDict.begin(), wordDict.end(), s0) != wordDict.end();
		calc(s, wordDict, dp, s.size() - 1);

		return dp.back();
	}

	bool calc(string &s, vector<string>& wordDict, vector<int>& dp, int i)
	{
		if (dp[i] != -1) return dp[i];

		//不拆分
		string str(s.begin(), s.begin() + i + 1); //[0, i]
		if (std::find(wordDict.begin(), wordDict.end(), str) != wordDict.end())
		{
			dp[i] = 1;
			return true;
		}

		bool flag = true;
		for (int k = 0; k < i; k++)
		{
			if (calc(s, wordDict, dp, k))
			{
				string str(s.begin() + k + 1, s.begin() + i + 1);//判断 [k+1, i] 是否在字典中

				if (std::find(wordDict.begin(), wordDict.end(), str) != wordDict.end())
				{
					dp[i] = 1; flag = false;
				}
			}
		}

		if (flag) dp[i] = 0;

		return dp[i];
	}
};

猜你喜欢

转载自blog.csdn.net/artisans/article/details/88944545
今日推荐