给定两个单词(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" 不在字典中,所以无法进行转换。
我的算法实现:
var ladderLength = function (beginWord, endWord, wordList) {
if (!wordList.includes(endWord)) {
return 0;
}
let n = 1;
let nextWord = beginWord;
let lastPos = [];
let man = []
let k = 0;
for (let i = 0; true; i++) {
if (lastPos.includes(i)) continue;
let res = getDifferentLettersNum(nextWord, endWord)
if (res === 1) {
nextWord = endWord;
return n + 1;
}
let diffLetter = getDifferentLettersNum(nextWord, wordList[i]);
if (diffLetter === 0) {
lastPos.push(i)
}
else if (diffLetter === 1) {
lastPos.push(i)
if (!man[k]) man[k] = []
man[k].push(wordList[i])
n += 1
} else if (diffLetter === -1) {
return 0;
}
if (man.length === 0 && i === wordList.length - 1) {
break;
}
if (i === wordList.length - 1) {
if (man[k].length === 0 && k === 0) {
break;
}else if (man[k].length === 0 && k !== 0) {
k -= 1;
}
nextWord = man[k].pop()
n -= 1
i = -1;
}
}
return 0;
};
function getDifferentLettersNum(c1, c2) {
if (!c1 || !c2) return -1;
if (c1.length !== c2.length) {
return -1;
}
let n = 0;
for (let i = 0; i < c1.length; i++) {
if (c1[i] === c2[i]) {
n += 1;
}
}
return c1.length - n;
}
没有解决这个问题,还是差一点,即便这样好了我也不满足,只不过这个问题应该有很好的数据结构来就更好。下面我会完成这个思路并且在将来使用更好的方法。
来源:力扣(LeetCode)