搜索專項——BFS

題目一 (單詞拼接)

題目鏈接https://leetcode.com/problems/word-ladder/

class Solution {
    public int ladderLength(String beginWord, String endWord, List<String> wordList) {
        int result = 1;
        int pre_number = 1;
        int next_number = 0;
        boolean[] used = new boolean[wordList.size()];
        
        Queue<String> queue = new LinkedList<String>();
        queue.offer(beginWord);
        
        while(!queue.isEmpty()){
            String cur = queue.poll();
            pre_number--;
            for(int i=0;i<wordList.size();i++){
                String word = wordList.get(i);
                if(!used[i]&&success(word,cur)){
                    if(endWord.equals(word)){
                        return ++result;
                    }
                    next_number++;
                    queue.offer(word);
                    used[i] = true;  
                }
            }
            if(pre_number == 0){
                result++;
                pre_number = next_number;
                next_number = 0;
            }
                   
        }
        return 0;
        
    }
                   
    public boolean success(String word, String cur){
        int diff = 0;
        for(int i=0;i<word.length();i++){
            if(word.charAt(i)!=(cur.charAt(i))){
                diff++;
            }
        }
        return diff==1?true:false;
    }
}

爲了減少後續的掃描時間,將使用過的單詞直接從list中刪除即可。

class Solution {
    public int ladderLength(String beginWord, String endWord, List<String> wordList) {
        int result = 1;
        int pre_number = 1;
        int next_number = 0;
        
        
        Queue<String> queue = new LinkedList<String>();
        queue.offer(beginWord);
        
        while(!queue.isEmpty()){
            String cur = queue.poll();
            pre_number--;
            for(int i=0;i<wordList.size();i++){
                String word = wordList.get(i);
                if(success(word,cur)){
                    if(endWord.equals(word)){
                        return ++result;
                    }
                    next_number++;
                    queue.offer(word);
                    wordList.remove(i);
                    i--;
                }
            }
            if(pre_number == 0){
                result++;
                pre_number = next_number;
                next_number = 0;
            }
                   
        }
        return 0;
        
    }
                   
    public boolean success(String word, String cur){
        int diff = 0;
        for(int i=0;i<word.length();i++){
            if(word.charAt(i)!=(cur.charAt(i))){
                diff++;
            }
        }
        return diff==1?true:false;
    }
}

兩次運行對比(第一個爲刪除單詞,第三個爲利用used數組判斷)
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章