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 }
浙公网安备 33010602011771号