1957 删除字符使字符串变好(draft)¶
需求¶
官方描述:一个字符串如果没有 三个连续 相同字符,那么它就是一个 好字符串 。给你一个字符串 s ,请你从 s 删除 最少 的字符,使它变成一个 好字符串 。请你返回删除后的字符串。题目数据保证答案总是 唯一的 。
实际需求:给定一个字符串,如果有三个及以上连续的相同字符,替换成两个字符
算法1¶
知识点:循环
时间复杂度:O(n)
空间复杂度:没有额外的对象或者数组占用(循环时每次字符串变化,占用内存较小)
主要逻辑:遍历字符串,把每一项加入新字符串。如果当前项和前两项都重复,不加入。
let init = '' + s[0] + s[1];
for (let i = 2; i < len; i++) {
if (s[i] === s[i - 2] && s[i] === s[i - 1]) {
continue;
}
init += s[i];
}
实际时间:Your runtime beats 97.33 % of javascript submissions
优点:思路简单
缺点:如果字符串特别长,性能下降
算法2¶
知识点:正则表达式
时间复杂度:O(1)
空间复杂度:没有额外的对象或者数组占用
主要逻辑:因为字符串中字符都是小写字母,个数有限,直接正则替换可以避免全部循环
for (var i = 0; i < 26; i++) {
let curr = String.fromCharCode(97 + i);
let reg = new Regexp(`/(${curr})\1{2}/`, 'g')
str = str.replace(reg, curr);
}
// todo:函数细节还有问题,需要修改
function fn() {
let str = 'aaaaaaaddddddddvbghj';
for (var i = 0; i < 26; i++) {
let curr = String.fromCharCode(97 + i);
// 问题,正则表达式中如何使用模板字符串?
let reg = new RegExp(`(${curr})\\1{2}`, 'gi')
str = str.replace(reg, curr);
}
// aaaddddvbghj 这样有效果,实际看一下为什么会这样
}
fn();
实际时间:无
优点:适合重复很多的情况(字符串长度上亿)
缺点:适合字符串较长,重复较多的情况,字符串长度短性能差