You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LeetCode1209 删除字符串相邻k次重复项代码输出错误原因求解

错误原因

你代码的问题出在pair<char,int> p = st.top();是值拷贝操作,你修改的只是栈顶元素的本地临时副本p,栈内部实际存储的计数并没有被更新,所以每次循环取到的栈顶计数还是旧值,无法正确累加。

对应你举的输入aabbbc、k=3的场景:
遍历到第二个b时,你仅把本地副本p的second改成了2,但栈里存储的b的计数还是1。下次遍历到第三个b时,取到的栈顶second依旧是1,只会再次把本地副本的计数改成2,不会触发等于k-1的弹出逻辑,最终三个b没有被删除,输出结果就会多出来一个b,得到错误的abc。

修复方案

只需要把接收栈顶元素的语句改成引用,直接操作栈内存储的元素即可:

pair<char,int>& p = st.top(); // 加&取引用,修改p等价于直接修改栈顶元素

也可以在修改完本地副本后,把更新后的副本写回栈顶:

p.second++;
st.top() = p;
修复后的完整代码
class Solution {
public:
    string removeDuplicates(string s, int k) {
        stack<pair<char,int>> st;
        string str;
        int idx = 0;
        st.push({s[idx++],1});
        while(idx < s.size()){
            if(st.empty()) {
                st.push({s[idx++],1});
                continue;
            }
            pair<char,int>& p = st.top();
            if(p.first == s[idx]){
                if(p.second < k-1){
                    p.second++;
                    idx++;
                }
                else {
                    st.pop();
                    idx++;
                }
            }
            else{
                st.push({s[idx++],1});
            }
        }
        while(!st.empty()){
            pair<char,int> p = st.top();
            st.pop();
            str.push_back(p.first);
        }
        reverse(str.begin(),str.end());
        return str;
    }
};

内容的提问来源于stack exchange,提问作者David Kim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 12:54:03