删除字符使字符串变好

184 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第28天,点击查看活动详情

题目描述

一个字符串如果没有 三个连续 相同字符,那么它就是一个 好字符串 。
给你一个字符串 s ,请你从 s 删除 最少 的字符,使它变成一个 好字符串 。
请你返回删除后的字符串。题目数据保证答案总是 唯一的 。
来源:力扣(LeetCode)

  • 示例 1
输入:s = "leeetcode"
输出:"leetcode"
解释:
从第一组 'e' 里面删除一个 'e' ,得到 "leetcode" 。
没有连续三个相同字符,所以返回 "leetcode"
  • 示例 2
输入:s = "aaabaaaa"
输出:"aabaa"
解释:
从第一组 'a' 里面删除一个 'a' ,得到 "aabaaaa" 。
从第二组 'a' 里面删除两个 'a' ,得到 "aabaa" 。
没有连续三个相同字符,所以返回 "aabaa"
  • 示例 3
输入: s = "aab"
输出: "aab"
解释: 没有连续三个相同字符,所以返回 "aab"

提示:

  • 1 <= s.length <= 105
  • s 只包含小写英文字母。

思路分析

什么是好字符串?一个字符串如果没有三个连续相同字符,那么它就是一个好字符串。从题目给我们的字符串s删除最少的字符,使他变成好字符串。
首先,如果一个字符串的长度小于3,那么它绝对是好字符串,因为满足不是好字符串的唯一条件就是三个一样的字符,很明显它永远不可能会满足这个条件。字符串的前两个字符串可以直接储存起来,前两个是必须要的。然后开始循环所有字符,从第三个开始,循环到某个字符串,每次都和前两个字符对比,若都是不相同的,可以直接添加到目标字符串中,有相同的就忽略,直至循环结束。

AC代码

function solution(str) {
    if(str.length < 3) {
        return str;
    }
    let newArr = str.split('');
    let res = newArr[0] + newArr[1];
    for(let i = 2; i < str.length; i++) {
        if(str[i - 2] !== str[i - 1] || str[i - 1] !== str[i]) {
            res += str[i]
        } 
    }
    console.log(res)
}
let str = "aaabaaaa";
solution(str);