class Solution {
public:
string makeFancyString(string s) {
}
};
1957. 删除字符使字符串变好
一个字符串如果没有 三个连续 相同字符,那么它就是一个 好字符串 。
给你一个字符串 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 <= 105
s
只包含小写英文字母。原站题解
rust 解法, 执行用时: 12 ms, 内存消耗: 2.4 MB, 提交时间: 2023-09-15 09:51:53
impl Solution { pub fn make_fancy_string(s: String) -> String { if s.len() < 2 { return s; } let mut res = String::with_capacity(s.len()); for a in s.as_bytes().windows(3) { if a[0] != a[1] || a[1] != a[2] { res.push(a[0] as char); } } res.push(s.as_bytes()[s.len()-2] as char); res.push(s.as_bytes()[s.len()-1] as char); res } // resolve 2 pub fn make_fancy_string2(s: String) -> String { let mut cnt = 0; let mut prev = ' '; let mut ans = "".to_string(); for c in s.chars() { if c == prev { if cnt < 2 { ans.push(c); } cnt += 1; } else { ans.push(c); prev = c; cnt = 1; } } ans } }
java 解法, 执行用时: 21 ms, 内存消耗: 43.8 MB, 提交时间: 2023-09-15 09:48:50
class Solution { public String makeFancyString(String s) { if ( s.length() <= 2) return s; char[] res = s.toCharArray(); int left = 2; for(int i = 2; i < res.length; i++) { if ( res[i] != res[left-1] || res[i] != res[left - 2] ){ res[left++] = res[i]; } } return new String(res).substring(0, left); } }
cpp 解法, 执行用时: 180 ms, 内存消耗: 40.4 MB, 提交时间: 2023-09-15 09:46:37
class Solution { public: string makeFancyString(string s) { string res; // 删除后的字符串 // 遍历 s 模拟删除过程 for (char ch : s){ int n = res.size(); if (n >= 2 && res[n-1] == ch && res[n-2] == ch){ // 如果 res 最后两个字符与当前字符均相等,则不添加 continue; } // 反之则添加 res.push_back(ch); } return res; } };
python3 解法, 执行用时: 668 ms, 内存消耗: 17.4 MB, 提交时间: 2023-09-15 09:45:12
class Solution: def makeFancyString(self, s: str) -> str: n = len(s) if n < 3: return s bs = '' for i in range(n): if i > 1 and s[i] == s[i-1] and s[i] == s[i-2]: continue else: bs += s[i] return bs
golang 解法, 执行用时: 32 ms, 内存消耗: 7 MB, 提交时间: 2021-08-13 12:56:11
func makeFancyString(s string) string { if len(s) < 3 { return s } var bs []byte for i := 0; i < len(s); i++ { if i > 1 && s[i] == s[i-1] && s[i] == s[i-2] { continue } else { bs = append(bs, s[i]) } } return string(bs) }
php 解法, 执行用时: 328 ms, 内存消耗: 23.2 MB, 提交时间: 2021-08-13 12:52:28
class Solution { /** * @param String $s * @return String */ function makeFancyString($s) { $out = str_split($s); $b = $s[0]; $freq = 1; for ( $i = 1; $i < strlen($s); $i++ ) { if ( $s[$i] == $b ) { $freq++; if ( $freq == 3 ) { $out[$i] = ''; $freq = 2; } } else { $b = $s[$i]; $freq = 1; } } return implode('', $out); } }