删除字符串中重复的连续单词的最快算法?

时间:2019-12-14 01:27:32

标签: javascript

这就是我得到的:

string = 'John bought bought black paint for his black car'
words = string.split(' ')
duplicatelessWords = []
for (const word of words) {
  if (duplicatelessWords[duplicatelessWords.length - 1] !== word) {
    duplicatelessWords.push(word)
  }
}
duplicatelessString = duplicatelessWords.join(' ')

应返回“约翰为他的黑色汽车购买了黑色油漆”

有没有办法使其更快?我想我需要连续多次使用它,有时是短字符串,有时是大字符串。

1 个答案:

答案 0 :(得分:5)

您可以使用正则表达式:

const string = 'John bought bought black paint for his black black car';
const replaced = string.replace(/(\b\w+)(?: \1\b)+/g, '$1');
console.log(replaced);

我不知道这是否是最快的选择,但是它会进行一次传递,并且仅在实际需要时才进行替换-因此,当没有重复的单词时,您不会拆分字符串。

  • (\b\w+)-匹配由字母数字字符组成的“单词”。您也可以将\S用于非空格。另请参见Unicode support。第一个单词将被捕获为组编号1。
  • (?: \1\b)+-找到我们捕获的相同单词(\1),重复多次(+)。
  • (?: )是一个未被捕获的逻辑组。
  • \b是一个单词边界,可确保我们不允许单词内部部分匹配。
  • '$1'-找到"bought bought"之类的重复单词后,我们将其替换为第一个单词:"bought"

请注意,当您在字符串中使用标点符号时,这种方法的效果很差。