列表

详情


NC318. 字符串的相邻字符去重

描述

给定一个仅由英文小写字母组成的字符串s,将相邻且相同的两个字符删掉构成新的字符串,重复删除操作直至生成不符合删除条件的字符串并返回。

示例1

输入:

"bcaac"

输出:

"b"

说明:

bcaac执行删除操作后变为bcc,再次执行删除操作变为b,此时不再符合删除条件故返回b。

示例2

输入:

"ab"

输出:

"ab"

说明:

原串即不符合删除条件,故直接返回。

示例3

输入:

"bcaaac"

输出:

"bcac"

说明:

bcaaac执行删除操作后变为 bcac ,此时不再符合删除条件

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C 解法, 执行用时: 4ms, 内存消耗: 440KB, 提交时间: 2022-06-27

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param s string字符串 
 * @return string字符串
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
char* removeDuplicates(char* s ) {
    int left = 0, right = 1;
    while(s[right] != '\0'){
        //printf("left=%d, right=%d\n", left, right);
        if(s[left] == s[right]){
            s[left] = s[right+1];
            left--;
        }
        else{
            left++;
            s[left] = s[right]; //删除字符,left字符后面字符变乱,比较过的字符,必须把右边的字符移动到左边
        }
        right++;
    }
    s[left+1] = '\0';

    return s;
}

C 解法, 执行用时: 4ms, 内存消耗: 440KB, 提交时间: 2022-06-19

char* removeDuplicates(char* s ) {
    int x = 1, y = 0;
    
    while (s[x] != '\0') {
        if (y < 0)
            s[y = 0] = s[x++];
        else {
            if (s[x] == s[y]) {
                y--;
                x++;
            } else
                s[++y] = s[x++];
        }
    }
    
    s[++y] = '\0';
    return s;
}

C 解法, 执行用时: 4ms, 内存消耗: 520KB, 提交时间: 2022-04-07

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param s string字符串 
 * @return string字符串
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
char* removeDuplicates(char* s ) {
    // write code here
    int i = 1, j = 0;
    while(s[i] != '\0'){
        if(j < 0) s[j=0] = s[i++];
        else{
            if(s[i] == s[j]){ j--; i++; }
            else s[++j] = s[i++];
        }
    }
    s[++j] = '\0';
    return s;
}

C++ 解法, 执行用时: 4ms, 内存消耗: 520KB, 提交时间: 2022-03-05

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @return string字符串
     */
    string removeDuplicates(string s) {
        string res;
        stack<char> st;
        int len=s.size();
        for(int i=0;i<len;i++)
        {
            if(st.empty())
                st.push(s[i]);
            else{
                if(st.top()==s[i])
                {
                    st.pop();
                }else
                    st.push(s[i]);
            }
        }
        while(!st.empty())
        {
            res.push_back(st.top());
            st.pop();
        }
        reverse(res.begin(), res.end());
        return res;// write code here
    }
};

C++ 解法, 执行用时: 4ms, 内存消耗: 524KB, 提交时间: 2022-08-02

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @return string字符串
     */
    string removeDuplicates(string s) {
        // write code here
        string result;
        for (char c:s) {
            if (result.empty() || result.back()!=c) {
                result.push_back(c);
            }
            else result.pop_back();
        }
        return result;
    }
};

上一题