对于这个问题,给出了一个字典并给出了两个字符串,基本上要求它只使用字典中的单词从一个字符串到达另一个字符串,并且一次只能更改一个字母。我想出了这个解决方案。我的代码无法处理一些极端情况。你能帮忙找到所有角落案例,使这段代码更漂亮吗?
public static int findNumberOfSteps(String start, String end , HashSet<String> dict){
if( start == null || end == null || dict.isEmpty()){
throw new IllegalArgumentException();
}
dict.add(end);
Queue<String> wordHolder = new LinkedList<>();
Queue<Integer> distanceCount = new LinkedList<Integer>();
wordHolder.add(start);
distanceCount.add(1);
int result = Integer.MAX_VALUE;
while (!wordHolder.isEmpty()){
String currentWord = wordHolder.poll();
int currDistance = distanceCount.poll();
if(currentWord.equals(end)){
int result = currDistance;
return result;
}
for (int i = 0 ; i < currentWord.length() ; i++){
char[] charCurrentWord = currentWord.toCharArray();
for ( char c = 'a' ; c <= 'z' ; c++){
charCurrentWord[i] = c;
String newWord = new String(charCurrentWord);
if (dict.contains(newWord)){
wordHolder.add(newWord);
distanceCount.add(currDistance+1);
dict.remove(newWord);
}
}
}
}
return 0;
}
答案 0 :(得分:1)
代码中存在一些问题。第一个问题出在这段代码中
if(currentWord.equals(end)){
result = Math.min(result, currDistance);
}
请注意,当您到达end
字词时,该代码会更新result
,但代码会搜索将end
字词更改为其他内容的方法。这是一个巨大的浪费时间,代码应该在找到while(!wordHolder.isEmpy())
之后继续end
循环。
第二个问题在于此代码
if (dict.contains(newWord)){
wordHolder.add(newWord);
distanceCount.add(currDistance+1);
dict.remove(newWord);
}
请注意,如果newWord
等于end
字,则该代码会从字典中删除end
字,这意味着您将会永远不会再找到end
字。
这两个问题的解决方案是检查end
语句中的if
字。找到end
后,请不要将其添加到wordHolder
,也不要将其从字典中删除。
if (dict.contains(newWord)){
if(newWord.equals(end)){
result = Math.min(result, currDistance+1);
}
else{
wordHolder.add(newWord);
distanceCount.add(currDistance+1);
dict.remove(newWord);
}
}