leetcode单词接龙(每日计划)

155 阅读1分钟

给定两个单词(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)