leetcode(844)---比较含退格的字符串(双指针)
Posted 叶卡捷琳堡
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode(844)---比较含退格的字符串(双指针)相关的知识,希望对你有一定的参考价值。
题目
844.比较含退格的字符串
给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果。 # 代表退格字符。
注意:如果对空文本输入退格字符,文本继续为空。
示例 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 = "#a#c"
输出:true
解释:S 和 T 都会变成 “c”。
示例 4:
输入:S = "a#c", T = "b"
输出:false
解释:S 会变成 “c”,但 T 仍然是 “b”。
提示:
1 <= S.length <= 200
1 <= T.length <= 200
S 和 T 只含有小写字母以及字符 '#'。
进阶:
你可以用 O(N) 的时间复杂度和 O(1) 的空间复杂度解决该问题吗?
题解一(遍历)
class Solution
{
public boolean backspaceCompare(String s, String t)
{
for(int i = 0;i < s.length();i++){
if(s.charAt(i) == '#'){
//如果有异常,就仅删除#
if(i-1 < 0){
s = s.substring(i+1);
i-=1;
}
//如果无异常,删除#后连接字符串
else{
s = s.substring(0,i-1) + s.substring(i+1);
i-=2;
}
}
}
for(int i = 0;i < t.length();i++){
if(t.charAt(i) == '#'){
//如果有异常,就仅删除#
if(i-1 < 0){
t = t.substring(i+1);
i-=1;
}
//如果无异常,删除#后连接字符串
else{
t = t.substring(0,i-1) + t.substring(i+1);
i -= 2;
}
}
}
return s.equals(t);
}
}
题解二(双指针)
退格仅取决于字符前面的#的个数,有几个#就退几个,如果前面#的个数为0,则该字符被保留
class Solution
{
public boolean backspaceCompare(String s, String t)
{
//定义两个指针,分别指向s与t的末尾
int i = s.length() - 1;
int j = t.length() - 1;
int skipS = 0;
int skipT = 0;
//当s与t都未遍历完时
while(i >= 0 || j >= 0){
//遍历s
while(i >= 0){
//如果是#,跳过的数目+1
if(s.charAt(i) == '#'){
skipS++;
i--;
}
else if(skipS > 0){
skipS--;
i--;
}
else{
break;
}
}
//遍历t
while(j >= 0){
//如果是#,跳过的数目+1
if(t.charAt(j) == '#'){
skipT++;
j--;
}
else if(skipT > 0){
skipT--;
j--;
}
else{
break;
}
}
if(i >= 0 && j >= 0){
//这个字符不会被吃掉
if(s.charAt(i) != t.charAt(j)){
return false;
}
}
//不等长
else if(i >= 0 || j >= 0){
return false;
}
i--;
j--;
}
return true;
}
}
以上是关于leetcode(844)---比较含退格的字符串(双指针)的主要内容,如果未能解决你的问题,请参考以下文章