题目
方法一:单指针
- 首先每次进入循环处理之前需要对第一个字符进行判断,若是退格符,直接删掉,结束此次循环
- fast从0开始,如果fast指向的字符不为# fast往后移动
- 如果fast指向的字符为 # 则删除 fast前面一个字符 和fast指向的字符 然后重置fast指针到起始点继续循环,直到没有#号符为止
- 在判断处理完的两个字符串是否相等
public boolean backspaceCompare(String s, String t) {
return letter(s).equals(letter(t));
}
public String letter(String s){
StringBuffer str = new StringBuffer(s);
int fast = 0;
while(fast< str.length()){
if(str.charAt(0) == '#') {
str = str.delete(0,1);
continue;
}
if(str.charAt(fast) != '#') fast++;
else{
str = str.delete(fast-1,fast+1);
fast = 0;
}
}
return str.toString();
}
方法二:双指针
- 定义一个尾部指针,和#号计数器
- 如果尾部指针遇到# ,删除#号同时 让#号计数器+1
- 如果遇到字符,根据#计数器的数量来删除字符,每遇到一个字符,如果#号计数器大于0,则直接删除字符。
- 若遇到字符时,#号计数器=0,说明之前没有退格符,则尾部指针直接往前移动
- 直到尾部指针<0,代表处理完成
public boolean backspaceCompare(String s, String t) {
return letter(s).equals(letter(t));
}
public String letter(String s){
StringBuffer str = new StringBuffer(s);
int end = str.length()-1;
int temp = 0;
while(end >= 0){
if(str.charAt(end)=='#') {
temp++;
str.delete(end,end+1);
}else{
if(temp > 0){
str.delete(end,end+1);
temp--;
}
}
end--;
}
return str.toString();
}
方法三:栈