127 Word Ladder
Given two words (beginWordandendWord), and a dictionary's word list, find the length of shortest transformation sequence frombeginWordtoendWord, such that:
Only one letter can be changed at a time.
Each transformed word must exist in the word list. Note that beginWord is not a transformed word.
For example,
Given:
beginWord="hit"
endWord="cog"
wordList=["hot","dot","dog","lot","log","cog"]
As one shortest transformation is"hit" -> "hot" -> "dot" -> "dog" -> "cog"
,
return its length5
.
Note:
Return 0 if there is no such transformation sequence.
All words have the same length.
All words contain only lowercase alphabetic characters.
You may assume no duplicates in the word list.
You may assume beginWord and endWord are non-empty and are not the same.
这题,有两个难点,1想到bfs,2怎么把word变成图的点连起来。这里提供两个算距离的方法,以供自己参考。还有两种concatinate那些单词的方法,第一种快点,因为第二种在leetcode超时了。
用level:
public int ladderLength(String beginWord, String endWord, Set<String> wordList) {
if (wordList == null || wordList.size() == 0) {
return 0;
}
if (beginWord.equals(endWord)) {
return 1;
}
wordList.add(beginWord);
wordList.add(endWord);
return bfs(beginWord, endWord, wordList);
}
private int bfs(String beginWord, String endWord, Set<String> wordList) {
HashSet<String> visited = new HashSet<>();
Queue<String> queue = new LinkedList<>();
queue.offer(beginWord);
visited.add(beginWord);
int level = 1;
while (!queue.isEmpty()) {
int size = queue.size();
level++;
for (int i = 0; i < size; i++) {
String curNode = queue.poll();
List<String> neighbor = getNeighbor(curNode, wordList);
for (String nei : neighbor) {
if (visited.contains(nei)) {
continue;
}
if (nei.equals(endWord)) {
return level;
}
visited.add(nei);
queue.offer(nei);
}
}
}
return 0;
}
private List<String> getNeighbor(String curNode, Set<String> wordList) {
char[] cs = curNode.toCharArray();
List<String> result = new ArrayList<>();
for (int i = 0; i < cs.length; i++) {
for (char c = 'a'; c <= 'z'; c++) {
char tmp = cs[i];
if (cs[i] == c) {
continue;
} else {
cs[i] = c;
}
String nei = new String(cs);
if (wordList.contains(nei)) {
result.add(nei);
}
cs[i] = tmp;
}
}
return result;
}
用distance hashmap:
public int ladderLength(String start, String end, Set<String> dict) {
if (start == null || end == null || start.length() == 0 || end.length() == 0 || dict == null) {
return 0;
}
if (start.equals(end)) {
return 1;
}
dict.add(start);
dict.add(end);
HashMap<String, Integer> visitedAndDis = new HashMap<>();
Queue<String> queue = new LinkedList<>();
queue.offer(start);
visitedAndDis.put(start, 1);
while (!queue.isEmpty()) {
int size = queue.size();
for (int i = 0; i < size; i++) {
String cur = queue.poll();
ArrayList<String> nei = findNei(cur, dict);
for (String n : nei) {
if (!visitedAndDis.containsKey(n)) {
int distance = visitedAndDis.get(cur) + 1;
visitedAndDis.put(n, distance);
if (n.equals(end)) {
return distance;
}
queue.offer(n);
}
}
}
}
return Integer.MAX_VALUE;
}
private ArrayList<String> findNei(String cur, Set<String> dict) {
ArrayList<String> nei = new ArrayList<String>();
for (int i = 0; i < cur.length(); i++) {
for (char c = 'a'; c <= 'z'; c++) {
if (cur.charAt(i) == c) {
continue;
}
String replaced = cur.substring(0, i) + c + cur.substring(i + 1);
if (dict.contains(replaced)) {
nei.add(replaced);
}
}
}
return nei;
}
Last updated
Was this helpful?