Leetcode1957——删除字符使字符串变好

Yuansj0206 / 2023-08-24 / 原文

一个字符串如果没有 三个连续 相同字符,那么它就是一个 好字符串 。

给你一个字符串 s ,请你从 s 删除 最少 的字符,使它变成一个 好字符串 。

请你返回删除后的字符串。题目数据保证答案总是 唯一的 

 

示例 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 <= 10e5
  • s 只包含小写英文字母。

思路很清晰,字符串长度最长10e5,所以遍历一次,利用计数器去计数,若超过三个则跳过当前字符去找下一个字符,若下一个字符和上一个字符不相同那么计数器就重新计数,遍历一遍即可得到答案。但是当我准备提交的时候发现,竟然超时了(ΩДΩ)!正当我百思不得其解去评论区逛的时候,发现了一个人和我的思路一模一样只是用的方法不太一样,我利用的是字符串的直接拼接,也就是string+string,而他用的是StringBuilder的append方法。于是我把方式也换成了append方法,竟然过了!

后来通过查询其他资料,发现了string+string字符串拼接和StringBuilder的append方法拼接效率是不同的!如果少量的字符串拼接,几乎是不影响的,但是如果需要拼接大量字符串,那么StringBuilder的append方法要比string+string方法的效率要高得多。原因是因为String在进行运算时会产生一个新的实例,而StringBuilder却不会,string+string实质上是将两个字符串写进内存,删除原来的string对象,再创建一个新的string对象,,读取内存中的数据赋给该对象,而Stringbuilder的append方法能够在已有对象的原地进行字符串的修改

有用的知识又增加了!Σ(⊙▽⊙"a