在字符串中找到最长的连续字符串模式并将其删除

时间:2018-11-19 17:42:36

标签: javascript ecmascript-6

我想知道既然找不到类似的主题,最好的方法是什么 在字符串中查找连续的字符串模式并从中删除它们。

我的意思是: 我有一个字符串:“ AAAAaaCCCCCCcDDDEEEE”,我想找到最长的相同连续字符串,因为C出现了6次,所以它将是CCCCCC,然后从字符串中删除它,所以我会得到“ AAAAaacDDDEEEE”,然后执行此操作一遍又一遍,直到只有一个连续的字符串。我已经尝试过自己做,但是似乎要花更多的代码来满足其简单性要求,

请帮助

3 个答案:

答案 0 :(得分:3)

您可以找到连续的字符并替换为空字符串。

var string = "AAAAaaCCCCCCcDDDEEEE",
    longest = string.match(/(.)\1*/g).reduce((a, b) => a.length > b.length ? a : b);
    
console.log(longest);

string = string.replace(longest, '');

console.log(string);

具有功能。

function remove(string) {
    var longest = string.match(/(.)\1*/g).reduce((a, b) => a.length > b.length ? a : b);

    while (longest.length > 1) {
        string = string.replace(longest, '');
        longest = string.match(/(.)\1*/g).reduce((a, b) => a.length > b.length ? a : b);
    }
    return string;
}
    
console.log(remove("AAAAaaCCCCCCcDDDEEEE"));

答案 1 :(得分:0)

另一个选择只是老式的while循环。与使用正则表达式相比,这将具有显着更高的性能,但代价是更多的代码和(一点)更少的可读性:

let s = "AAAAaaCCCCCCCcDDDEEEE"

let start = 0, max = 0, current = 0, maxStart = 0
while(current <= s.length) {
  if (s[current] !== s[start]){   
    if (current - start > max){
      max = current - start 
      maxStart = start
    }
    start = current
  }
  current++
}

// the found string:
console.log(s.substring(maxStart, maxStart+max))

// delete
s = s.slice(0,maxStart) + s.slice(max + maxStart) 
console.log(s)

答案 2 :(得分:0)

您可以使用正则表达式来获取链的数组。使用Math.max()Array.map()获得最长链的长度。使用Array.filter()删除最长的链,然后使用Array.join()合并回字符串。

这将处理多个相同长度的长链。

const removeLongest = (str) => {
  const chains = str.match(/(.)\1*/g); // get an array of chains
  const longest = Math.max(...chains.map(s => s.length)); // find the longest chain length
  return chains.filter(({ length }) => length !== longest) // remove longest chains
    .join(''); // convert array back to string
};
   
console.log(removeLongest('AAAAaaCCCCCCcDDDEEEE')); // AAAAaacDDDEEEE
console.log(removeLongest('AAAAaaCCCCCCcDDDEEEEEE')); // AAAAaacDDD