Word Break (leedcode)

题目:

Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separated sequence of one or more dictionary words.

For example, given
s = "leetcode",
dict = ["leet", "code"].

Return true because "leetcode" can be segmented as "leet code".

题目来源:https://oj.leetcode.com/problems/word-break/

解题思路:dfs超时,从第一个字母开始,不断增加字母查看是否在字典中,如果是,接着从下一个字符开始查找,时间复杂度是O(2^n),计算:F(n)=F(n-1)+F(n-2)+……+F(1),F(1)=1,则F(2)=1,F(3)=2,F(4)=4……F(n)=2^(n-2).

由于可以进行深搜,有可能具有动归实现的可能性,考虑用动归。动归:用f[i]表示s[0,i)是否可分割,true表示可以,false表示不可以,则f[i]=f[j] &&s[j,i)在字典中,这样就可以用动归来解了。

注意:当一个问题可以用深搜来解,且超时,则可以考虑用动态规划来解。

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

bool wordBreak(string s,int first,int last,unordered_set<string> &dict)
{
	if(dict.find(string(s.begin()+first,s.end()))!=dict.end())
		return true;
	for(int i=first;i<last;i++)
	{
		if(dict.find(string(s.begin()+first,s.begin()+i+1))!=dict.end() && wordBreak(s,i+1,last,dict))
				return true;
	}
	return false;
}

bool wordBreak(string s, unordered_set<string> &dict)
{
	return wordBreak(s,0,s.size()-1,dict);
}

bool wordBreak1(string s, unordered_set<string> &dict)
{
	vector<bool> f(s.size()+1,false);//f[i]表示s[0,i)可分
	f[0]=true;//0个字符可以分割
	for(int i=1;i<=s.size();i++)
	{
		for(int j=i-1;j>=0;j--)
		{
			if(f[j] && dict.find(s.substr(j,i-j))!=dict.end())
			{
				f[i]=true;
				break;
			}
		}
	}
	return f[s.size()];
}
  
int main()  
{  
	unordered_set<string> dict;
	dict.insert("aa");
	dict.insert("aaaa");
	string s="aaaaaa";
	cout<<wordBreak1(s,dict)<<endl;

    system("pause");  
    return 0;  
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值