我正在为我的 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;
}
如果你改变一个字母,或者在单词的结尾添加一个字母(例如mat->math),它就可以正常工作。但是,如果您在单词中添加一个字母(例如 mat->malt),它表示该单词不遵守规则,即使它确实遵守。如何更改函数以便它也能捕获单词中添加的字母?
答案 0 :(得分:0)
我觉得这样更容易理解。
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)
}