原题地址:https://oj.leetcode.com/problems/word-ladder/
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.
思路:刚看到题,有dict,感觉像是动态规划,但没有发现最优子结构。转换成图问题,点为同样长度的所有小写字符串,只相差一个字符的字符串之间有连线,利用图的BFS,期间需要通过点是否在Dict中进行剪枝,第一次得到end字符串的即为最浅的变换过程,也就是最短的变换序列。时间复杂度为(26^len * dict.size());
public class Solution {
public int ladderLength(String start, String end, Set<String> dict) {
if (start == null || start.length() < 1 || end == null || end.length() < 1) {
return 0;
}
Queue<String> queue = new LinkedList<String>();
Set<String> visited = new HashSet<String>();
queue.offer(start);
visited.add(start);
int lastNum = 1;
int curNum = 0;
int level = 1;
while (!queue.isEmpty()) {
String currStr = queue.poll();
char[] charArr = currStr.toCharArray();
lastNum--;
for (int i = 0; i < charArr.length; i++) {
char temp = charArr[i];
for (char ch = 'a'; ch <= 'z'; ch++) {
charArr[i] = ch;
String newStr = new String(charArr);
if (newStr.equals(end)) {
return level + 1;
}
if (dict.contains(newStr) && !visited.contains(newStr)) {
visited.add(newStr);
queue.offer(newStr);
curNum++;
}
}
charArr[i] = temp;
}
if (lastNum == 0) {
level++;
lastNum = curNum;
curNum = 0;
}
}
return 0;
}
}