LeetCode-127-单词接龙

图片

图片

//单向遍历
package com.likou.one;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
/**
 * @author 谦虚
 * @version 1.0
 * @date 2020/11/5 22:23
 */
public class Test {
    public int ladderLength(String beginWord, String endWord, List<String> wordList) {
        //用于快速查找单词
        HashSet<String> words = new HashSet<>(wordList);
        //若字典中不存在endWord或字典为0, 结束
        if (words.size() == 0 || !wordList.contains(endWord)) {
            return 0;
        }
        //移除beginWord避免受影响
        words.remove(beginWord);
        //用于存放第i层的所有节点
        Queue<String> queue = new LinkedList<>();
        //把beginWord加入队列中
        queue.add(beginWord);
        //用于存放已经遍历过的节点
        HashSet<String> visit = new HashSet<>();
        //置beginWord于已访问队列
        visit.add(beginWord);
        //用于计算最短路径, 且因为从beginWord开始, 置为1
        int flag = 1;
        //2.开始广度优先遍历
        while (!queue.isEmpty()) {
            //由于队列的数量会发生变化
            int size = queue.size();
            for (int i = 0; i < size; i++) {
                //一次遍历队列中的每一个单词
                String word = queue.poll();
                char[] currentWord = word.toCharArray();
                if (changeWordEveryOneLetter(currentWord, words, visit, queue, endWord)) {
                    return flag+1;
                }
            }
            flag++;
        }
        return 0;
    }
    public boolean changeWordEveryOneLetter(char[] currentWord, HashSet<String> words,
                                            HashSet<String> visit, Queue<String> queue, String endWord){
        //遍历每一个字母找出能通往的所有节点
        for (int i = 0; i < endWord.length(); i++) {
            char orginChar = currentWord[i];
            for (char j = 'a'; j <= 'z'; j++) {
                if (j == orginChar) {
                    continue;
                }
                currentWord[i] = j;
                String word = String.valueOf(currentWord);
                if (words.contains(word)) {
                    if (word.equals(endWord)) {
                        return true;
                    }
                    if (!visit.contains(word)) {
                        queue.add(word);
                        visit.add(word);
                    }
                }
            }
            currentWord[i] = orginChar;
        }
        return false;
    }
}
//双向遍历
class Solution {
    public int ladderLength(String beginWord, String endWord, List<String> wordList) {
        //用于快速查找单词
        HashSet<String> words = new HashSet<>(wordList);
        //若字典中不存在endWord或字典为0, 结束
        if (words.size() == 0 || !wordList.contains(endWord)) {
            return 0;
        }
        int flag = 1;
        //用于记录已经访问过的单词
        HashSet<String> visit = new HashSet<>();
        //头遍历
        HashSet<String> startWords = new HashSet<>();
        startWords.add(beginWord);
        //尾遍历
        HashSet<String> endWords = new HashSet<>();
        endWords.add(endWord);
        while (!startWords.isEmpty() && !endWords.isEmpty()) {
            if (startWords.size() > endWords.size()) {
                HashSet<String> temp = startWords;
                startWords = endWords;
                endWords = temp;
            }
            HashSet<String> newStartWords = new HashSet<>();
            for (String word : startWords) {
                char []currentWord = word.toCharArray();
                if (changeWordEveryOneLetter(currentWord, words, visit, endWords, newStartWords)) {
                    return flag+1;
                }
            }
            flag++;
            startWords = newStartWords;
        }
        return 0;
    }

    public boolean changeWordEveryOneLetter(char[] currentWord, HashSet<String> words,
                                            HashSet<String> visit,
                                            HashSet<String> endWords,
                                            HashSet<String> newStartWords){
        for (int i = 0; i < currentWord.length; i++) {
            char orginChar = currentWord[i];
            for (char j = 'a'; j <= 'z'; j++) {
                if (j == orginChar) {
                    continue;
                }
                currentWord[i] = j;
                String word = String.valueOf(currentWord);
                if (words.contains(word)) {
                    if (endWords.contains(word)) {
                        return true;
                    }
                    if (!visit.contains(word)) {
                        newStartWords.add(word);
                        visit.add(word);
                    }
                }
            }
            currentWord[i] = orginChar;
        }
        return false;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值