World Break求解两法

【题目】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"
.

【方法一】采用递归的方法。该方法最简单最直观。一个循环,判断字符串开头到第i个字符是否匹配,如果匹配则对第i到length个字符组成的子串。这个方法虽然简单,但是运行时间太长,无疑超时。

<span style="font-size:18px;">public static boolean wordBreak(String s, Set<String> dict) {
	if(s==null)return false;
	if(dict.contains(s)||s.equals(""))return true;
	int size=s.length();

	for(int i=1;i<size;i++)
	{
		if(dict.contains(s.substring(0,i)))
		{
			if(wordBreak(s.substring(i),dict))return true;
		}
	}
	return false;
    }</span>

【方法二】对方法一进行改进,用一个Boolean数组来保存前i个字符的匹配结果,显然数组的长度为length+1。外层循环依次取原字符串各个长度的子字符串;内层循环判断当前子串是否能找到切分方式,只要找到一种切分方式就说明长度为i的单词可以成功切分,因此可以跳出内层循环。

<span style="font-size:18px;">public static boolean  wordBreak2(String s, Set<String> dict)
{
	boolean []match=new boolean[s.length()+1];
	match[0]=true;
	for(int i=1;i<=s.length();i++)
		for(int j=i-1;j>=0;j--)
		{
			if(match[j]&&dict.contains(s.substring(j, i)))
			{
				match[i]=true;
				break;
			}
		}
	return match[s.length()];
}</span>

这两个算法的效率都不高,这个问题一定还有高效的算法,欢迎补充

时间: 2024-11-07 13:08:19

World Break求解两法的相关文章

[C++]LeetCode: 113 Word Break II (DP &amp;&amp; Backtacking) 求解拆分组合

题目: Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each word is a valid dictionary word. Return all such possible sentences. For example, given s = "catsanddog", dict = ["cat", "cats

C语言-循环结构及break、continue

循环结构 -------------------------- --1-- 结构循环 1.1 while循环 1.2 do…while循环 1.3 for循环 --2-- break和continue 2.1 break关键字 2.2 continue关键字 -------------------------- [写在开头:] 『 生活中的循环: C语言中的循环: 循环结构是程序中一种很重要的结构.其特点是,在给定的条件成立时,反复执行某程序段,直到条件不成立为止. C语言中提供了多种循环语句:

数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值

一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚,所以很多需要自己揣摩.这也体现了算法和程序设计语言的特点,算法更侧重本质的描述,而任何编程语言都要照顾到实现的细节以及数据类型等语法方面的需求. 表达式求值: [编码中....] 二.头文件 迷宫求解: 1 //3_2_maze.h 2 /** 3 author:zhaoyu 4 email:[em

extend_gcd求解不定方程/膜线性方程/乘法逆元

形如a*x+b*y=c 为不定方程,a,b>0其实无所谓,因为gcd(a,b)=gcd(|a|,|b|)   //gcd为最大公约数 由数论的定理所知,当c%gcd==0,不定方程有解,现在我们来求这个解. gcd=gcd(a,b);a*b=gcd*lcm;  //lcm为最小公倍数 a'=a/gcd;b'=b/gcd;c'=c/gcd; a'目前与b'互质 令c''=1=a'*x+b'*y; 利用extend_gcd求出一组特解.(x0,y0) (x0*c'.y0*c')为 a'*x+b'*y

数论之拓展欧几里得求解不定方程和同余方程组(一)

今天接到scy的压缩包,开始做数论专题.那今天就总结一下拓展欧几里得求解不定方程和同余方程组. 首先我们复习一下欧几里得算法: 1 int gcd(int a,int b){ 2 if(b==0) return a; 3 return gcd(b,a%b);4 } 拓展欧几里得算法: 推导过程: 给出A和B,求它们的最大公约数,并且求出x和y,满足Ax+By=gcd(A,B). 当A=0时,x=0,y=1; 当A>0时, 因为exgcd(A,B,x,y)表示Ax+By=gcd(A,B) 而且ex

二分求幂,快速求解a的b次幂

一个引子 如何求得a的b次幂呢,那还不简单,一个for循环就可以实现! void main(void) { int a, b; int ans = 1; cin >> a >> b; for (int i = 1; i <= b; i++) { ans *= a; } cout << ans; } 那么如何快速的求得a的b次幂呢?上面的代码还可以优化吗? 当然是ok的!下面就介绍一种方法-二分求幂. 二分求幂 所谓二分求幂,即是将b次幂用二进制表示,当二进制位k位

hdu3586 树形dp+二分求解

http://acm.hdu.edu.cn/showproblem.php?pid=3586 Problem Description In the battlefield , an effective way to defeat enemies is to break their communication system. The information department told you that there are n enemy soldiers and their network w

求解两个序列的所有最长公共子序列(LCSes)

 摘要 本篇博文提供了实现求解所有最长公共子序列的程序实现,并提供输出所有公共子序列的方法解释,需要具备基础知识是求解一个公共子序列的动态规划方法,请自行查阅相关资料. 题目重述 子序列概念:设X=< x1, x2,┅, xm>,若有1≤i1< i2< ┅ <ik≤m,使得Z=< z1, z2,┅, zk> = < xi1, xi2,┅, xik>,则称Z是X的子序列,记为Z<X. 例如: X=<A,B,C,B,D,A,B>, 

蚁群算法求解迷宫最优路径问题

本段程序的基本思想是利用蚁群算法中的蚁周模型,来对全局的迷宫图进行信息素的跟新 和为每一只蚂蚁选择下一个方格. 一共会进行RcMax = 2000轮模拟(理论上模拟的次数越多结果 会越接近真实值),而在每一轮中会排除 M = 10只蚂蚁进行探路.同时在算法的回溯思想上采用的 是栈的数据结构来实现的.当栈最终为空时则表示无解.但同时这段程序的一缺点就是:由于我没在 算法中对每一轮的每只探路蚂蚁采用多线程的模式,所以整体的运行效率还不是很高.如读者有好的 思想或建议,请留言. #include<io