Given two words (start and end), and a dictionary, find the length of shortest transformation sequence from start to end, such that:
- Only one letter can be changed at a time
- Each intermediate word must exist in the dictionary
For example,
Given:
start = "hit"
end = "cog"
dict = ["hot","dot","dog","lot","log"]
As one shortest transformation is "hit" -> "hot" -> "dot" -> "dog" -> "cog"
,
return its length 5
.
Note:
- Return 0 if there is no such transformation sequence.
- All words have the same length.
- All words contain only lowercase alphabetic characters.
https://oj.leetcode.com/problems/word-ladder/
思路:BFS求最短路径。队列弹出字符串,每次变换一个字母,如果在字典中则插入队列,并从字典中删除。插入null来分层。
import java.util.HashSet; import java.util.LinkedList; import java.util.Queue; import java.util.Set; public class Solution { public int ladderLength(String start, String end, Set<String> dict) { Queue<String> queue = new LinkedList<String>(); dict.add(end); queue.add(start); queue.add(null); int len = start.length(); int res = 1; while (!queue.isEmpty()) { String cur = queue.remove(); if (cur != null && cur.equals(end)) { return res; } if (cur != null) { for (int i = 0; i < len; i++) { char[] str = cur.toCharArray(); for (int j = 0; j < 26; j++) { char ch = (char) ('a' + j); if (str[i] != ch) { str[i] = ch; String changed = new String(str); if (dict.contains(changed)) { queue.add(changed); dict.remove(changed); } } } } } else if (!queue.isEmpty()) { res++; queue.add(null); } } return 0; } public static void main(String[] args) { Set<String> set = new HashSet<String>(); String[] a = { "hot", "dot", "dog", "lot", "log" }; for (String each : a) set.add(each); System.out.println(new Solution().ladderLength("hit", "log", set)); } }
第二遍记录:
bfs的题目,注意null的用法,注意细节。
第三遍记录:
考虑各种边界情况,比如set是空的(end一开始会加进去,就不空了)
public class Solution { public int ladderLength(String start, String end, Set<String> dict) { dict.add(end); Queue<String> queue = new LinkedList<String>(); queue.add(start); queue.add(null); int step = 1; int len =start.length(); while(!queue.isEmpty()){ String out = queue.remove(); if(out==null){ step++; if(!queue.isEmpty()) queue.add(null); }else{ if(out.equals(end)){ return step; } for(int i=0;i<len;i++){ char[] tmp = out.toCharArray(); for(int j=0;j<26;j++){ tmp[i]=(char)('a'+j); String newStr= new String(tmp); if(dict.contains(newStr)){ dict.remove(newStr); queue.add(newStr); } } } } } return 0; } }