884.比较含退格的字符串
给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true 。# 代表退格字符。
注意:如果对空文本输入退格字符,文本继续为空。
示例1
输入:s = "ab#c", t = "ad#c"
输出:true
解释:s 和 t 都会变成 "ac"。
示例2
输入:s = "ab##", t = "c#d#"
输出:true
解释:s 和 t 都会变成 ""。
示例3
输入:s = "a#c", t = "b"
输出:false
解释:s 会变成 "c",但 t 仍然是 "b"。
分析
1.使用栈
可以使用栈,当遇到#时,弹出栈顶元素,最后比较两个栈是否相同,但是最后比较的时候还需要把栈里的数据取出来再比较,比较麻烦,可以直接将给定的字符串作为栈,后面比较会比较简单
2.使用双指针
使用双指针,分别从两个字符串的最后一个位置往前遍历,再引入两个变量记录两个字符串各自需要退格的数量,如果退格的数量用完了,那么就比较当前位置是否相同,不同的话就返回false,相同的话继续往前遍历
实现
1.字符串模拟栈
class Solution {
public boolean backspaceCompare(String S, String T) {
return sb(S).equals(sb(T));
}
public String sb(String s){
StringBuilder sb = new StringBuilder();
char[] arr = s.toCharArray();
for(int i = 0;i<arr.length;i++){
if(arr[i]!='#'){
sb.append(arr[i]);
}else{
if(sb.length()>0){
sb.deleteCharAt(sb.length()-1);
}
}
}
return sb.toString();
}
}
2.双指针
class Solution {
public boolean backspaceCompare(String S, String T) {
int slen = S.length()-1,tlen = T.length()-1;
int s = 0,t = 0;
while(slen>=0||tlen>=0){
while(slen>=0){
if(S.charAt(slen)=='#'){
s++;slen--;
}else if(s>0){
s--;slen--;
}else{
break;
}
}
while(tlen>=0){
if(T.charAt(tlen)=='#'){
t++;tlen--;
}else if(t>0){
t--;tlen--;
}else{
break;
}
}
if(slen>=0&&tlen>=0){
if(S.charAt(slen)!=T.charAt(tlen)){
return false;
}
}else{
if(slen>=0||tlen>=0){
return false;
}
}
slen--;
tlen--;
}
return true;
}
}
Comments | NOTHING