单词拆分--力扣

Posted 穿迷彩服的鲨鱼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单词拆分--力扣相关的知识,希望对你有一定的参考价值。


前言

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


一、示例

示例 1:

输入: s = “CSDNCSND”, wordDict = [“CSDN”]
输出: true
解释: 返回 true 因为 “CSDNCSDN” 可以被拆分成 “CSDN CSDN”。
示例 2:

输入: s = “hkzpenhkz”, wordDict = [“hkz”, “pen”]
输出: true
解释: 返回 true 因为 “hkzpenhkz” 可以被拆分成 “hkz pen hkz”。
注意你可以重复使用字典中的单词。
示例 3:

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

二、代码解析

1.单词拆分

代码如下(示例):

bool wordBreak(string s, vector<string>& wordDict)
{
	int n = s.length();
	vector<bool> dp(n + 1, false);//创建一个一维数组,里面存储bool标识位
	dp[0] = true;//设置第一个标识位,判断上一个单词是否存在数组中
	for (int i = 1; i <= n; ++i)
	{
		for (auto word : wordDict)
		{
			int ws = word.size();
			//只有当单词的长度小于当前单词下标,当前dp标识位为真且当前截取的单词就是数组中的单词时,才可以标志下一个标识位
			if (ws <= i && dp[i - ws] && s.substr(i - ws, ws) == word)
			{
				dp[i] = true;
			}
		}
	}
	//返回最后一个标识位
	return dp[n];
}

结果

在这里插入图片描述

2.动态规划

代码如下(示例):

bool wordBreak(string s, vector<string>& wordDict)
{
	unordered_set <string> wordDictSet;
	for (auto word : wordDict)
	{
		wordDictSet.insert(word);
	}

	vector<bool> dp(s.size() + 1, false);
	dp[0] = true;
	for (int i = 1; i <= s.size(); ++i)
	{
		for (int j = 0; j < i; ++j)
		{
			if (dp[j] && wordDictSet.find(s.substr(j, i - j)) != wordDictSet.end())
			{
				dp[i] = true;
				break;
			}
		}
	}

	return dp[s.size()];
}

结果

在这里插入图片描述

3.测试

代码如下(示例):

#include<vector>
#include <iostream>
#include <unordered_set>
using namespace std;

bool wordBreak(string s, vector<string>& wordDict)
{
	//int n = s.length();
	//vector<bool> dp(n + 1, false);//创建一个一维数组,里面存储bool标识位
	//dp[0] = true;//设置第一个标识位,判断上一个单词是否存在数组中
	//for (int i = 1; i <= n; ++i)
	//{
	//	for (auto word : wordDict)
	//	{
	//		int ws = word.size();
	//		//只有当单词的长度小于当前单词下标,当前dp标识位为真且当前截取的单词就是数组中的单词时,才可以标志下一个标识位
	//		if (ws <= i && dp[i - ws] && s.substr(i - ws, ws) == word)
	//		{
	//			dp[i] = true;
	//		}
	//	}
	//}
	返回最后一个标识位
	//return dp[n];
	unordered_set <string> wordDictSet;
	for (auto word : wordDict)
	{
		wordDictSet.insert(word);
	}

	vector<bool> dp(s.size() + 1, false);
	dp[0] = true;
	for (int i = 1; i <= s.size(); ++i)
	{
		for (int j = 0; j < i; ++j)
		{
			if (dp[j] && wordDictSet.find(s.substr(j, i - j)) != wordDictSet.end())
			{
				dp[i] = true;
				break;
			}
		}
	}

	return dp[s.size()];
}


int main()
{
	vector<string> wordDict = { "apple", "pen" };
	cout << wordBreak("applepenapple", wordDict);
	return 0;
}

结果

在这里插入图片描述


总结

在这里插入图片描述

以上是关于单词拆分--力扣的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 0139. 单词拆分

LeetCode 139. 单词拆分 | Python

LeetCode 0140. 单词拆分 II

2021-10-15:单词拆分。给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。说明:拆分时可以重复使用字典中的单词。你

2021-10-16:单词拆分 II。给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中。返回所有这些可能的句子。

前K个高频单词--力扣