力扣打卡
说一下我的思路叭:
一开始希望能用数组直接去进行模拟,但是发现好像擦除的过程比较麻烦,还要去置空。
稍微扫一眼题解,发现这就是一个栈的操作啊。
思路如下:
(1)边界的情况就是如果没字符了,但是任然去删除就会有问题。所以换一个角度说,只有在栈不空,且存在#,才可以删除字符。
(2)关于处理:存在两种方式;1.对stl的元素进行比较,就是迭代器直接进行比较,2.取出栈顶元素top()操作,如果栈顶元素不相同的话,那么就是false。然后pop()继续去进行进行栈顶元素比较
代码如下:
class Solution {
public:
//现在就是说#可以去退一格
//就是一种特殊情况,需要计算上去
//擦出的过程就像是栈啊
bool backspaceCompare(string S, string T) {
// stack<char> S_res;
// stack<char> T_res;
// int len1=S.size(),len2=T.size();
// //求解答案,然后再去比价长度
// for(int i=0;i<len1;i++){
// // if(S[i]=='#'){
// // //还有一种操作是前面没有字符,但是仍然删除字符的方式
// // if(S_res.empty()) continue;//处理删不掉的情况
// // S_res.pop();
// // }
// //这么写不太好,其实就是不空,且#,才可以去弹栈
// if(S[i]=='#'&&!S_res.empty()) S_res.pop();
// else S_res.push(S[i]);
// }
// for(int j=0;j<len2;j++){
// // if(T[j]=='#'){
// // //处理特殊的边界情况
// // if(T_res.empty()) continue;
// // T_res.pop();
// // }
// if(T[j]=='#'&&!T_res.empty()) T_res.pop();
// else T_res.push(T[j]);
// }
// //处理最终答案
// if(T_res.size()!=S_res.size()) return false;
// //接着比较内容
// for(int l=0;l<T_res.size();l++){
// //调用栈顶元素使用的是top()
// if(T_res.top()!=S_res.top()){
// return false;
// }
// T_res.pop(),S_res.pop();
// }
// return true;
// if(S_res==T_res) return true;
// else return false;
stack<char> a,b;
for(int i=0;i<S.size();i++){
//只有在有#且不空的时候才可以去进行弹栈
if(S[i]=='#'&&!a.empty()) a.pop();
if(S[i]!='#') a.push(S[i]);
}
for(int j=0;j<T.size();j++){
if(T[j]=='#'&&!b.empty()) b.pop();
if(T[j]!='#') b.push(T[j]);
}
//他妈直接比较啊,艹,
if(a==b) return true;
else return false;
}
};