leetcode :word 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".

题目地址:http://oj.leetcode.com/problems/word-break/

属于动态规划问题,通过循环递归来实现。

Public class Solution{
public boolean isProbably(HashSet<String>dict,String x){
		for(String con:dict){
			if(con.endsWith(x)||x.endsWith(con)){
				//System.out.println("回溯的子串"+x+"||"+con);
				return true;
			}
		}
		return false;
	}
public int wordBreakP (String s,HashSet<String> dict,int index){
		//循环递归退出条件
		//boolean sth;
		if(index>=s.length()) {return 1;}
		else {
			int j;
			for( j=1;index+j-1<s.length();j++){
				if(dict.contains(s.substring(index, index+j))){
					//System.out.println("trying:"+s.substring(index, index+j));
					int value=wordBreakP(s,dict,index+j);
					if(value==1){ 
						return 1;}
					else if(value==-1){//快速收敛
						return -1;
					}
				}
			}
			if(index+j-1>=s.length()){
				//System.out.println("回溯:"+s.substring(index, index+j-1));
				if(!isProbably(dict,s.substring(index, index+j-1))){
					return -1;
				}
				return 0;
				}
			//System.out.println("error");
			return 0;
		}
		
	}
	public boolean wordBreak(String s,HashSet<String> dict){
	     if( wordBreakP(s,dict,0)==1){
	    	 return true;
	     }else{
	    	 return false;
	     }

}

  大概说一下思路,一开始没有isProbably的判断,结果几次提交都是exceed time,观察了具体的测试事例后发现是

  在如下的情况下:String s="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab"

          dict: a,aa,aaa,aaaa,aaaaa,aaaaaa,aaaaaaa.....

      即是在运行结果失败时循环递归的收敛速度太慢,所以加了一个判断,在每次当前递归失败需要往上回溯的时候,判断当前回溯的子串是否是

dict中的某个串的结尾串或者某个串是回溯串的子串。加快失败情况的收敛速度,本地调试时自己加一个main方法吧。。。

 1     public  static void main(String[] args){
 2         String s="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab";
 3         //String s="goalspecial";
 4         HashSet <String>dict=new HashSet();
 5         dict.add("go");
 6         dict.add("goal");
 7         dict.add("goals");
 8         dict.add("special");
 9         dict.add("go");
10         dict.add("a");
11         dict.add("aa");
12         dict.add("ba");
13         //dict.add("aaa");
14         //dict.add("aaaa");
15         //dict.add("aaaaa");
16         //dict.add("aaaaaa");
17         //dict.add("aaaaaaa");
18         //dict.add("aaaaaaaa");
19         //dict.add("aaaaaaaaa");
20         //dict.add("aaaaaaaaaa");
21         dict.add("mei");
22         Solution x=new Solution();
23         System.out.println("result is :"+x.wordBreak(s,dict));
24     }

 

posted on 2015-03-09 15:49  Charles晟  阅读(156)  评论(0)    收藏  举报

导航