【问题标题】:node.js – Check if word has an added/changed letter to a previous wordnode.js – 检查单词是否在前一个单词中添加/更改了字母
【发布时间】:2021-06-28 02:47:46
【问题描述】:

我正在为我的 Discord 机器人编写一个命令,该命令允许玩游戏,其中目标是发布可以更改前一个单词中的一个字母或添加一个字母的单词。我正在使用这个功能:

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)中添加一个字母 in,则表示该单词不符合规则,即使它确实如此。我怎样才能改变这个函数,让它也能捕捉到单词中添加的字母?

【问题讨论】:

    标签: javascript node.js discord.js letter


    【解决方案1】:

    我认为这更容易理解。

    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)
    }
    

    【讨论】:

    • 我想这只是编写代码的一种更短的方法,所以我感谢你。但是即使你的代码和我的代码一样,它仍然说如果你在单词的开头或里面添加一个字母,这个单词就不算数。
    • 糟糕,我确实误读了您的问题。我将更改我的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 2015-03-28
    相关资源
    最近更新 更多