Skip to content

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();

实际时间:无

优点:适合重复很多的情况(字符串长度上亿)

缺点:适合字符串较长,重复较多的情况,字符串长度短性能差