Leecode 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 <= s.length, t.length <= 200
- s 和 t 只含有小写字母以及字符 ‘#’
代码如下:
public boolean backspaceCompare(String s, String t) {
int i = s.length() - 1;
int j = t.length() - 1;
//用skipS和skipT来记录需要跳过字符的数量
int skipS = 0, skipT = 0;
//遍历完一个字符串时退出循环
while (i >= 0 || j >= 0) {
while (i >= 0) {
//首先判断当前字符是否为退格字符
//若为退格字符,指针前移
if (s.charAt(i) == '#') {
skipS++;
i--;
//通过检查skipS的数量来判断当前字符是否会被删除
} else if (skipS > 0) {
skipS--;
i--;
} else {
break;
}
}
while (j >= 0) {
//首先判断当前字符是否为退格字符
//若为退格字符,指针前移
if (s.charAt(j) == '#') {
skipT++;
j--;
//通过检查skipS的数量来判断当前字符是否会被删除
} else if (skipT > 0) {
skipT--;
j--;
} else {
break;
}
}
if (i >= 0 && j >= 0) {
//有一个字符不一样直接返回false
if (s.charAt(i) != t.charAt(j)) {
return false;
}
} else {
//有一个字符串遍历结束了
if (i >= 0 || j >= 0){
return false;
}
}
i--;
j--;
}
return true;
}
时间复杂度:O(M + N)
空间复杂度:O(1)