classSolution{ funladderLength(beginWord: String, endWord: String, wordList: List<String>): Int { // 所有单词长度一致 val wordLength = beginWord.length
// key是通配词,value是这个通配词对应的所有词 val map = mutableMapOf<String, MutableList<String>>() wordList.forEach { word -> for (i in0 until wordLength) { val key = word.substring(0, i) + '*' + word.substring(i + 1, wordLength) val list = map.getOrDefault(key, mutableListOf()) list.add(word) map[key] = list } }
// 访问数组,防止绕环 val visited = mutableSetOf(beginWord)
// 广度优先搜索 val queue = ArrayDeque<String>() queue.add(beginWord) var level = 1 val emptyList = mutableListOf<String>() while (queue.isNotEmpty()) { val count = queue.size repeat(count) { val word = queue.poll() for (i in0 until wordLength) { val key = word.substring(0, i) + '*' + word.substring(i + 1, wordLength) val adjacentWords = map.getOrDefault(key, emptyList) adjacentWords.forEach { adjacentWord -> // 加1是因为endWord也算一个步骤,要加上 if (adjacentWord == endWord) return level + 1 if (!visited.contains(adjacentWord)) { visited.add(adjacentWord) queue.add(adjacentWord) } } } } level++ } return0 } }