嗨,我正在为面试练习,我想知道是否有更好的解决方案来解决这个问题:
给定一个键String key="apple"
和一个排序的字符串数组,String[] words ={apple, apples, bananaaple, orangebanana, pearapples}
编写一个函数,true
当您可以连接以使用单词列表中的单词获取键字符串时返回该函数,false
如果您不能。
我的想法是从密钥字符串中的一个字母开始,然后从世界列表中进行二进制搜索,如果存在,则找到字符串的其余部分;如果没有,再增加一个字母,然后做同样的事情。
我的代码:
public static void main(String[] args){
String[] words = {"apple", "apples", "bananaaple", "orangebanana", "pearapples"};
String key = "apple";
System.out.println(expanding(words,key));
}
public static boolean expanding(String[] words, String key){
if(key.length()<1){
return false;
}
for(int i=1; i<=key.length(); i++){
String sub = key.substring(0, i);
boolean found =search(words,sub,0,words.length-1);
if(found){ //get next piece
String theSubString =key.substring(i, key.length());
if(theSubString.compareToIgnoreCase("")==0){
return found;
}
boolean re = expanding(words,theSubString );
if(re)
return true;
}
}
return false;
}
public static boolean search(String[] list, String key, int min, int max){
if(min>max){
return false;
}
int mid = (min+max)/2;
if(list[mid].compareToIgnoreCase(key)==0){
return true;
}else if(list[mid].compareToIgnoreCase(key)<0){
return search(list,key,mid+1,max);
}else{
return search(list,key,min,mid-1);
}
}
在我看来,最好的情况应该是 O(log n),但不确定最坏的情况......也许 O(n^2) 一次只能匹配一个字母。
谁能给我更多的想法?