列表

详情


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" 。

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: string makeFancyString(string 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);
    }
}

上一题