使用给定的字典从一个字符串到达​​另一个字符串

时间:2015-10-08 21:10:29

标签: arrays algorithm validation dictionary data-structures

对于这个问题,给出了一个字典并给出了两个字符串,基本上要求它只使用字典中的单词从一个字符串到达​​另一个字符串,并且一次只能更改一个字母。我想出了这个解决方案。我的代码无法处理一些极端情况。你能帮忙找到所有角落案例,使这段代码更漂亮吗?

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;               
}

1 个答案:

答案 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);
    }                       
}