【发布时间】:2017-07-02 06:07:20
【问题描述】:
我想确保我正确地进行了时间复杂度分析。似乎有很多不同的分析。
以防人们不知道问题,这是问题描述。
给定两个单词(
beginWord和endWord)和一个字典的单词列表,找出从beginWord到endWord的最短转换序列的长度,这样:一次只能更改一个字母。 每个转换后的单词都必须存在于单词列表中。请注意,beginWord 不是转换后的单词。 例如,
给定:
beginWord = "hit" endWord = "cog" wordList = ["hot","dot","dog","lot","log","cog"]因为一个最短的变换是“hit” -> “hot” -> “dot” -> “dog” -> “cog”, 返回它的长度 5。
这是简单的 BFS 算法。
static int ladderLength(String beginWord, String endWord, List<String> wordList) {
int level = 1;
Deque<String> queue = new LinkedList<>();
queue.add(beginWord);
queue.add(null);
Set<String> visited = new HashSet<>();
// worst case we can add all dictionary thus N (len(dict)) computation
while (!queue.isEmpty()) {
String word = queue.removeFirst();
if (word != null) {
if (word.equals(endWord)) {
return level;
}
// m * 26 * log N
for (int i = 0; i < word.length(); i++) {
char[] chars = word.toCharArray();
for (char c = 'a'; c <= 'z'; c++) {
chars[i] = c;
String newStr = new String(chars);
if (!visited.contains(newStr) && wordList.contains(newStr)) {
queue.add(newStr);
visited.add(newStr);
}
}
}
} else {
level++;
if (!queue.isEmpty()) {
queue.add(null);
}
}
}
return 0;
}
wordList(字典)包含N元素,beginWord的长度是m
在最坏的情况下,队列将包含单词列表中的所有元素,因此,外部 while 循环将运行 o(N)。
对于每个单词(长度 m),它会尝试 26 个字符(a 到 z),因此内部嵌套的 for 循环是 o(26*m),而在内部 for 循环内部,它确实 wordList.contains 假设它是 o(logN)。
所以总的来说它是 o(N*m*26*logN) => o(N*mlogN)
它是否正确?
【问题讨论】: