文章目录
题目
方法一:单指针
- 首先每次进入循环处理之前需要对第一个字符进行判断,若是退格符,直接删掉,结束此次循环
- fast从0开始,如果fast指向的字符不为# fast往后移动
- 如果fast指向的字符为 # 则删除 fast前面一个字符 和fast指向的字符 然后重置fast指针到起始点继续循环,直到没有#号符为止
- 在判断处理完的两个字符串是否相等
java
// 方法一 : 单指针
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++;//如果fast指向的字符不为# fast往后移动
else{//如果fast指向的字符为 # 则删除 fast前面一个字符 和fast字符 然后重置fast指针到起始点
str = str.delete(fast-1,fast+1);//注意 这里删除区间元素 是 左闭右开的 要删除 left ,right 区间的元素 delete(left,right+1)
fast = 0;//重置fast
}
}
return str.toString();//返回处理好的字符串
}
方法二:双指针
- 定义一个尾部指针,和#号计数器
- 如果尾部指针遇到# ,删除#号同时 让#号计数器+1
- 如果遇到字符,根据#计数器的数量来删除字符,每遇到一个字符,如果#号计数器大于0,则直接删除字符。
- 若遇到字符时,#号计数器=0,说明之前没有退格符,则尾部指针直接往前移动
- 直到尾部指针<0,代表处理完成
java
// 方法二 : 双指针 本质还是单指针 指针从字符串尾部向前移动,一旦遇到# 记录退格的数量 遇到字符就根据退格数量删除字符,直到指针<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+1,同时删除#号
temp++;
str.delete(end,end+1);
}else{//遇到非#号 判断#数量来删除尾部字符
if(temp > 0){
str.delete(end,end+1);
temp--;//更新#号数量
}
}
end--;//尾部指针向前移动
}
return str.toString();//返回处理好的字符串
}