LeetCode 127. 单词接龙

127. 单词接龙

 

【BFS】借助队列实现BFS,具体思路为先把begin放入队列,同时设置一个visit的哈希表来记录当前字符串是否被访问过,再设置一个bk的哈希表用来记录合法的序列也就是wordList。由于需要得到最短的转换路径,因此需要带层次信息的BFS实现方式,对于每一层的每个word,从头到尾分别用26个字母来替换原来的值,如果替换后的字符串没有出现在visit并且存在bk中时判断是否和end相同,相同直接返回当前层数即可,否则将它加入下一层的队列中继续迭代。

class Solution {

    public int ladderLength(String beginWord, String endWord, List<String> wordList) {
        Set<String> bk = new HashSet();
        for(var st: wordList) bk.add(st);
        Set<String> visit = new HashSet();
        int ans = 0;
        Deque<String> queue = new LinkedList();
        queue.offer(beginWord);
        visit.add(beginWord);
        while(!queue.isEmpty()){
            int k = queue.size();
            ans++;
            while(k-- > 0){
                char[] s = queue.poll().toCharArray();
                for(int i = 0, n = s.length; i < n; i++){
                    for(int j = 0; j < 26; j++){
                        char[] clone = s.clone();
                        clone[i] = (char)('a' + j);
                        String tmp = String.valueOf(clone);
                        if(!visit.contains(tmp) && bk.contains(tmp)){
                            if(tmp.equals(endWord)) return ++ans;
                            queue.offer(tmp);
                            visit.add(tmp);
                        }
                    }
                }
            }
        }
        return 0;   
    }
}

【双向BFS】

双向BFS的思路为一个从start开始BFS,一个从end开始BFS,每次更新较短的队列。当两个的搜索集合出现交集的时候就说明找到了最短路径。

class Solution {
    Set<String> set = new HashSet();
    int ans = -1;

    public void bfs(Deque<String> queue, int d, Map<String, Integer> map, Map<String, Integer> mp){
        int k = queue.size();
        while(k-- > 0){
            char[] c = queue.poll().toCharArray();
            for(int i = 0, n = c.length; i < n; i++){
                for(int j = 0; j < 26; j++){
                    char[] clone = c.clone();
                    clone[i] = (char)(j + 'a');
                    String str = String.valueOf(clone);
                    if(set.contains(str) && !map.containsKey(str)){
                        if(mp.containsKey(str)){
                            // System.out.println(str);
                            ans = d + mp.get(str);
                            return;
                        }
                        map.put(str, d);
                        queue.offer(str);
                    }
                }
            }
        }
    }

    public int ladderLength(String beginWord, String endWord, List<String> wordList) {
        for(var str: wordList) set.add(str);
        if(!set.contains(endWord)) return 0;
        set.add(beginWord);
        Deque<String> st = new LinkedList();
        Deque<String> ed = new LinkedList();
        Map<String, Integer> m1 = new HashMap();
        Map<String, Integer> m2 = new HashMap();
        int d1 = 0, d2 = 0;
        st.offer(beginWord);
        m1.put(beginWord, 0);
        ed.offer(endWord);
        m2.put(endWord, 0);
        while(!st.isEmpty() && !ed.isEmpty()){
            if(st.size() < ed.size()) bfs(st, ++d1, m1, m2);
            else bfs(ed, ++d2, m2, m1);
            if(ans != -1) return ans + 1;
        }
        return 0;
    }
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值