212 - 127 单词接龙
题目
给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度。转换需遵循如下规则:
每次转换只能改变一个字母。
转换过程中的中间单词必须是字典中的单词。
说明:
如果不存在这样的转换序列,返回 0。
所有单词具有相同的长度。
所有单词只由小写字母组成。
字典中不存在重复的单词。
你可以假设 beginWord 和 endWord 是非空的,且二者不相同。
示例 1:
输入: beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log","cog"]
输出: 5
解释: 一个最短转换序列是 "hit" -> "hot" -> "dot" -> "dog" -> "cog", 返回它的长度 5。
示例 2:
输入: beginWord = "hit" endWord = "cog" wordList = ["hot","dot","dog","lot","log"]
输出: 0
解释: endWord "cog" 不在字典中,所以无法进行转换。
解答
应该是通过找相似度,来一个个转换。但也要记一下换过的单词,不然会来回倒腾
https://leetcode.com/problems/word-ladder/discuss/157376/Python-(BFS)-tm
每个字都换一遍26个字母,来判断能不能到下一个字
class Solution:
def ladderLength(self, beginWord: str, endWord: str, wordList: List[str]) -> int:
import collections
import string
arr = set(wordList)
q = collections.deque([(beginWord, 1)])
visited = set()
alpha = string.ascii_lowercase
while q:
word, length = q.popleft()
if word == endWord:
return length
for i in range(len(word)):
for ch in alpha:
new_word = word[:i]+ch+word[i+1:]
if new_word in arr and new_word not in visited:
q.append((new_word, length+1))
visited.add(new_word)
return 0
Runtime: 560 ms, faster than 18.25% of Python3 online submissions for Word Ladder.
Memory Usage: 13.6 MB, less than 96.55% of Python3 online submissions for Word Ladder.
https://leetcode-cn.com/problems/word-ladder/solution/127-dan-ci-jie-long-by-alexer-660/
这个也是比较26字母,不过是用ascii码进行比较的。
var ladderLength = function(beginWord, endWord, wordList) {
let wordListSet = new Set(wordList)
if (!wordListSet.has(endWord)) {
return 0
}
let beginSet = new Set()
beginSet.add(beginWord)
let endSet = new Set()
endSet.add(endWord)
let level = 1
while (beginSet.size > 0) {
let next_beginSet = new Set()
for (let key of beginSet) {
for (let i = 0; i < key.length; i++) {
for (let j = 0; j < 26; j++) {
let s = String.fromCharCode(97 + j)
if (s != key[i]) {
let new_word = key.slice(0, i) + s + key.slice(i + 1)
if (endSet.has(new_word)) {
return level + 1
}
if (wordListSet.has(new_word)) {
next_beginSet.add(new_word)
wordListSet.delete(new_word)
}
}
}
}
}
beginSet = next_beginSet
level++
if (beginSet.size > endSet.size) {
[beginSet, endSet] = [endSet, beginSet]
}
}
return 0
};
Runtime: 108 ms, faster than 98.27% of JavaScript online submissions for Word Ladder.
Memory Usage: 43.2 MB, less than 28.57% of JavaScript online submissions for Word Ladder.
Last updated
Was this helpful?