node.js – 检查单词是否有前一个单词的 added/changed 字母

node.js – Check if word has an added/changed letter to a previous word

我正在为我的 Discord 机器人开发一个允许玩游戏的命令,目标是 post 个单词,要么改变前一个单词中的一个字母,要么添加一个信件。我正在使用这个功能:

function checkDifferentString(str1, str2) {
  let diff = 0;
  if (str1 === str2) return true;
  let lengthDiff = Math.abs(str1.length - str2.length)
  if (lengthDiff > 1) return false;

  for (let i=0; (i<str1.length || i < str2.length);i++) {
    if (diff > 1) return false;
    if (str1.charAt(i) !== str2.charAt(i)) diff++
  }
  if (diff <= 1) return true
  else return false;
}

如果你改变一个字母,或者在单词的 end 添加一个字母(例如 mat->math),它就可以正常工作。但是如果你在这个词中添加一个字母(例如mat->malt),它表示这个词不符合规则,即使它符合。我怎样才能改变这个功能,让它也能捕捉到单词中添加的字母?

我觉得这样比较容易理解

function isChanged(prev, curr) {
  return (prev.length + 1 === curr.length && curr.slice(0, prev.length) === prev) 
    || (prev.length === curr.length && Array.from(prev).filter((ch, idx) => ch != curr[idx]).length === 1)
}

添加一个字符时第一个条件为真。 当只有一个不同的字符时,第二个条件为真。

  • 已更新(我确实看错了你的问题)

要检查更改一个字母,请使用最长公共序列(https://en.wikipedia.org/wiki/Longest_common_subsequence_problem)。 如果两个字符串的长度相同为N,且最长公共序列的长度为N-1,则表示改变了一个字母。 如果两个字符串的长度分别为N和N+1,最长公共序列的长度为N,则表示加了一个字母。

function lengtOfLCS(s1, s2) {
  // LCS algorithm..
  return result
}
function isChanged(prev, curr) {
  return (prev.length === curr.length && lengtOfLCS(prev, curr) === prev.length - 1)
    || (prev.length+1 === curr.length && LCSlengtOfLCSprev, curr) === prev.length)
}