[Leetcode]Word Ladder

来源:互联网 发布:淘宝网店海报设计技巧 编辑:程序博客网 时间:2024/06/05 16:35

[题目]

Given two words (beginWord and endWord), and a dictionary, find the length ofshortest transformation sequence frombeginWord to endWord, such that:

  1. Only one letter can be changed at a time
  2. 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.

[思路]

思路是BFS。。。。

一个词语变动一个字母,有很多种情况:26 * word.length() ,都要遍历到,而且dictionary里面可能有不止一个候选,所以每一层,要用一个queue来存储。

string.subString(int start, int end):只能取到start - > end -1

start the offset of the first character
end the offset one past the last character
s.substring(0,0)也是成立的,合法的。


[代码]

并没有通过测试,理由是:out of time limited..

public int ladderLength(String start, String end, Set<String> dict) {    LinkedList<String> queue = new LinkedList<String>();    queue.add(start);    dict.add(end);    int step = 0while (!queue.isEmpty()) {        LinkedList<String> level = new LinkedList<String>();        step++;        while (!queue.isEmpty()) {            String q = queue.pollFirst();            if (q.equals(end))                return step;            for (int i = 0; i < start.length(); i++) {                for (char c = 'a'; c <= 'z'; c++) {                    String s = q.substring(0, i) + c + q.substring(i + 1, start.length());                    if (dict.contains(s)) {                        level.add(s);                        dict.remove(s);                    }                }            }        }        queue = level;    }    return 0;}

唯一的区别就是将string q没有直接使用substring, 而是换成了charArray(),然后替换r里面第i个,在把新组成的string s 放在dict里面判断。

public int ladderLength(String start, String end, Set<String> dict) {    LinkedList<String> queue = new LinkedList<String>();    queue.add(start);    dict.add(end);    int step = 0;    while (!queue.isEmpty()) {        LinkedList<String> level = new LinkedList<String>();        step++;        while (!queue.isEmpty()) {            String q = queue.poll();            if(q.equals(end))                return step;            char[] t = q.toCharArray();            for(int i = 0; i < start.length(); i++){                for(char c = 'a'; c <= 'z'; c++){                    char temp = t[i];                    t[i] = c;                    String s = String.copyValueOf(t);                    t[i] = temp;                    if(dict.contains(s)){                        level.add(s);                        dict.remove(s);                    }                }            }        }        queue = level;    }    return 0;}


0 0