我想知道既然找不到类似的主题,最好的方法是什么 在字符串中查找连续的字符串模式并从中删除它们。
我的意思是: 我有一个字符串:“ AAAAaaCCCCCCcDDDEEEE”,我想找到最长的相同连续字符串,因为C出现了6次,所以它将是CCCCCC,然后从字符串中删除它,所以我会得到“ AAAAaacDDDEEEE”,然后执行此操作一遍又一遍,直到只有一个连续的字符串。我已经尝试过自己做,但是似乎要花更多的代码来满足其简单性要求,
请帮助
答案 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