引言
做自己就好。
题目
https://leetcode-cn.com/problems/backspace-string-compare/
分析
这题不难,就是重新构造字符串;但是如果我们直接在原字符串上操作的话,会比较麻烦;
最好重新构造一个字符串来记录操作后得到的串;
思路
方法一:
遇到字母,将其压入栈中;碰到‘#’,弹出;
string build2(string s){
int l=s.size();
string ans="";
for(int i=0;i<l;i++){
if(s[i]=='#'){///!!这里要加大括号,不然下一个if会跟else对应
if(!ans.empty())
ans.erase(ans.size()-1);
}
else {
ans.push_back(s[i]);
}
}
return ans;
}
方法二:
根据题目能知道字母的保留与否只与后一个字符有关;于是可以逆序遍历,找出‘#’的个数,根据‘#’的个数判断是否保留字母。
string build1(string s){
//逆序遍历
int l=s.size();
string ans="";
int skip=0;
for(int i=l-1;i>=0;i--){
if(s[i]=='#')skip+=1;
else {
//为字母
if(skip==0){
ans+=s[i];
}
else
skip-=1;
}
}
return ans;
}
方法三:
这种方法就是在原字符串上进行操作,是相当麻烦的一种方法,一不小心就会出现下标越界等问题,因此不推荐
bool backspaceCompare(string S, string T) {
for(int i=0;i<S.size();i++){
if(S[i]=='#'){
S.erase(i,1);
i-=1;
if(i!=-1){
S.erase(i,1);
i-=1;
}
}
}
for(int i=0;i<T.size();i++){
if(T[i]=='#'){
T.erase(i,1);
i-=1;
if(i!=-1){
T.erase(i,1);
i-=1;
}
cout<<T<<endl;
}
}
return S==T;
}
总结
- 这种需要修改、增加数组/字符串元素的题目,最好用vector(可变数组),string等类型处理;
- 处理的时候尤其注意下标越界问题;