简单思路:采用递归,每次把匹配到的前缀给去掉,然后进入下一层次的递归。直到把s变成空串,说明能够组成该单词。否则不能组成该单词。
//该版本仅能通过牛客的测试案例,但仍需完善,比如当测试用例是
//"nowcoder",["no","now","coder"]时,则会返回错误的结果,原因是没有回溯。
import java.util.*;
public class Solution {
public boolean wordDiv (String s, String[] dic) {
if(s.equals(""))return true;
for(int i=0;i<=s.length();++i){
for(int j=0;j<dic.length;++j){
if(dic[j].equals(s.substring(0,i))){
return wordDiv(s.substring(i),dic);
}
}
}
return false;
}
}
//这个版本增加了回溯功能,可以正确通过所有用例,但是仍有优化空间,至于具体如何优化,
//请读者自行思考(如何解决测试用例"11111111111...",["1","11"...]这个超时的问题?(考虑哈希表))。
import java.util.*;
public class Solution {
boolean isExist;
public boolean wordDiv (String s, String[] dic) {
if(s.equals("")){
isExist = true;
return true;
}
boolean res = false;
for(int i=0;i<=s.length();++i){
for(int j=0;j<dic.length;++j){
if(dic[j].equals(s.substring(0,i))){
res = isExist||wordDiv(s.substring(i),dic);
}
}
}
return res;
}
}