题目描述
给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度。转换需遵循如下规则:
每次转换只能改变一个字母。
转换过程中的中间单词必须是字典中的单词。
说明:
如果不存在这样的转换序列,返回 0。
所有单词具有相同的长度。
所有单词只由小写字母组成。
字典中不存在重复的单词。
你可以假设 beginWord 和 endWord 是非空的,且二者不相同。
示例 1:
输入:
beginWord = “hit”,
endWord = “cog”,
wordList = [“hot”,“dot”,“dog”,“lot”,“log”,“cog”]
总结
先实现,再优化,不要总是眼高手低
总体就是暴力,不过进行了一些优化吧
Sample & Demo Code
class Solution {
public int ladderLength(String beginWord, String endWord, List<String> wordList) {
if (wordList == null || wordList.size() == 0) return 0;
HashSet<String> start = new HashSet<>(); //存储的是由上一单词可变形出的单词
HashSet<String> end = new HashSet<>(); //反向start
HashSet<String> dic = new HashSet<>(wordList);
if(!dic.contains(endWord)) return 0;
start.add(beginWord);
end.add(endWord);
return DFS(start, end, dic, 2);
}
private int DFS(HashSet<String> st, HashSet<String> ed, HashSet<String> dic, int len) {
if(st.size() == 0) return 0;
if(st.size() > ed.size()) return DFS(ed, st, dic, len); //不要忘记写return
dic.removeAll(st);
HashSet<String> next = new HashSet<>();
for(String s : st) {
char[] arr = s.toCharArray();
for(int i = 0; i < arr.length; i++) {
char temp = arr[i];
for(char c = 'a'; c <= 'z'; c++) {
if(temp == c) continue;
arr[i] = c;
String nstr = new String(arr);
if(dic.contains(nstr)) {
if(ed.contains(nstr)) return len;
else next.add(nstr);
}
}
arr[i] = temp;
}
}
return DFS(next, ed, dic, len+1);
}
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/word-ladder