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
相关产品推荐
相关产品推荐

