【问题标题】:How can I check if merging 2 adjacent duplicated characters in a word can produce a specific word?如何检查合并单词中的 2 个相邻重复字符是否可以生成特定单词?
【发布时间】:2020-04-02 17:17:39
【问题描述】:

如果我在 word1 中合并 2 个相邻的重复字符,我想检查是否可以从 word1 生成 word2。

例如:

word1 = 'peete'
word2 = 'pete' //OK, because merging ee into e in word1 produces word2

word1 = 'peetee'
word2 = 'peete'

word1 = 'meet'
word2 = 'met'

到目前为止我有这个,但它因一些输入而失败:

let checkMerge = (word1, word2) => {
  let charArr = word1.split('');
  let resultArr = [];
  let needToMerge = '';
  for (let i = 0; i < charArr.length; ++i) {
    if (charArr[i] == charArr[i + 1]) continue
    resultArr.push(charArr[i]);
  }
  let resultWord = resultArr.join('');
  if (resultWord == word2) {
    console.log(`JOIN ${needToMerge}`);
  } else {
    console.log(`something's wrong`)
  }
}

checkMerge('peete', 'pete'); //correct
checkMerge('peetee', 'peete'); //fails
checkMerge('meet', 'met'); //correct

我还必须得到我需要合并的角色 (let needToMerge = '';),但我做错了。所以最终的输出应该是这样的:'JOIN char'我应该做些什么不同的?谢谢你。

编辑:

更多说明: function checkMerge 有两个词,word1word2。我必须检查是否可以通过最多一次合并从word1 获得word2word2 不能修改,只能通过一次合并修改 word1。 如果word2 可以通过合并word1 中的两个相邻字符从word1 生成,则该函数应返回"JOIN c"(只执行一次合并)。

例如: 给定word1 = 'peetee'word2 = 'peete',函数应该返回'JOIN e',因为如果我们合并word1 的最后两个字符(ee),我们会得到'peete',它等于word2

给定word1 = 'peetee'word2 = 'petee',函数应该返回'JOIN e',因为如果我们合并word1的第一个重复字符(ee),我们得到'petee'等于word2 .

【问题讨论】:

  • 好吧,你永远不会更新needToMerge,我猜当if 循环中的if 条件评估为真时charArr[i]
  • 是的,我试过 needToMerge = charArr[i] 但有时它写错了字符。
  • 如果您有兴趣,这里有一个清理后的版本:pastebin.com/nCyEq49D

标签: javascript arrays string function


【解决方案1】:

您可以使用其他字符串的偏移量来过滤字符。

const
    checkMerge = (string1, string2) => [...string1]
         .filter((i => (c, j) => c !== string2[i + j] && --i)(0))

console.log(checkMerge('peete', 'pete'));      // e
console.log(checkMerge('peetee', 'peete'));    // e
console.log(checkMerge('peeteerr', 'peeter')); // er
console.log(checkMerge('meet', 'met'));        // e

【讨论】:

  • 谢谢,问题是我不能修改word2,只有word1可以修改一次合并。您能否根据此更新您的解决方案?谢谢!
  • 我不知道你想要什么。你有想要的结果的例子吗?
  • 是的,我编辑了我的原始帖子,添加了一些说明和更多示例。谢谢!
  • checkMerge('peeteerr', 'peeter'); 应该不起作用,因为我们必须在 word1(ee 和 rr)上进行两次合并才能获得 word2word1 上只允许进行一次合并。
  • 你可以检查数组长度并返回错误,或者任何合适的。
【解决方案2】:

您可以用一个字符替换重复的字符,然后匹配。

let checkMerge = (word1, word2) => {
  word1 = word1.replace(/([a-z])\1+/g,"$1")
  word2 = word2.replace(/([a-z])\1+/g,"$1")
  return word1.indexOf(word2) !== -1
}

console.log(checkMerge('peete', 'pete')); //correct
console.log(checkMerge('peetee', 'peete')); //correct
console.log(checkMerge('meet', 'met')); //correc
console.log(checkMerge('meete', 'meta'));    // false

let checkMerge2 = (word1, word2) => {
  word1 = word1.replace(/([a-z])\1+/g,"$1")
  return word1.indexOf(word2) !== -1
}

console.log(checkMerge2('peete', 'pete')); //correct
console.log(checkMerge2('peetee', 'peete')); //fail
console.log(checkMerge2('meet', 'met')); //correc
console.log(checkMerge2('meete', 'meta'));    // false

【讨论】:

  • 我已经尝试过您的代码,但它以 'peetee' 和 'peete' 失败。但是它应该可以工作,因为如果函数仅合并 word1 = peetee 末尾的两个 ee,则结果将是 peete 等于 word2。
猜你喜欢
  • 1970-01-01
  • 2021-09-18
  • 1970-01-01
  • 2015-06-24
  • 2011-05-20
  • 2013-12-23
相关资源
最近更新 更多