比较含退格的字符串
给定 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 只含有小写字母以及字符 '#'
进阶:
你可以用 O(n) 的时间复杂度和 O(1) 的空间复杂度解决该问题吗?
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/backspace-string-compare
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:双指针
从前面开始比较的话,当前的字符并不确定会不会被删除掉,所以可以从后面开始遍历比较。如果是退格键的话就不断退格,直到遇到字符,再比较即可。但是模拟退格的过程犯了挺多错误试错了很久,最后的代码也不够优雅。还是要想清楚伪代码有大致确定的思路再动手吧2333.挖个坑,后面看一下别人怎么写的。
code
class Solution {
public:
//从后向前比较是否相等而不是从前向后
//遇到空格键向前退格,直到两个都是字母为止
bool backspaceCompare(string s, string t) {
int i = s.size() -1,j = t.size() -1;
//记录退格键数目
int cnt1 = 0,cnt2 = 0;
while(i >= 0 && j >= 0)
{
//不断退格直到出现字母为止
//模拟退格的过程直到两个都指向字母或者为空
//关键:如何模拟退格的过程,脑袋混乱了这么简单的过程愣是没有想清楚
//模拟退格过程并且最后遇到的是字母or越界
while(i >= 0 && s[i] == '#')
{
//从当前的退格键往前退格直到退格完成
cnt1 = 1;
i --;
while(cnt1 > 0)
{
if(i >= 0 && s[i] == '#') cnt1 ++,i--;
else cnt1 --,i--;
}
}
while(j >= 0 && t[j] == '#')
{
//从当前位置开始退格
cnt2 = 1;
j --;
while(cnt2 > 0)
{
if(j >= 0 && t[j] == '#') cnt2 ++,j--;
else cnt2 --,j --;
}
}
if(i >= 0 && j >= 0 && s[i] == t[j])
{
i--,j--;
}
else if(i >= 0 && j >= 0 && s[i] != t[j])
{
return false;
}
}
//最后可能长的一部分是空的因此我们还要收尾处理一下
//"nzp#o#g"
//"b#nzp#o#g"
while(i >= 0 && s[i] == '#')
{
//从当前的退格键往前退格直到退格完成
cnt1 = 1;
i --;
while(cnt1 > 0)
{
if(i >= 0 && s[i] == '#') cnt1 ++,i--;
else cnt1 --,i--;
}
}
while(j >= 0 && t[j] == '#')
{
//从当前位置开始退格
cnt2 = 1;
j --;
while(cnt2 > 0)
{
if(j >= 0 && t[j] == '#') cnt2 ++,j--;
else cnt2 --,j --;
}
}
if(i < 0 && j < 0) return true;
else return false;
}
};
标签:cnt1,--,---,while,cnt2,&&,退格,指针
From: https://www.cnblogs.com/huangxk23/p/17169520.html