一、环境说明
- 本文是 LeetCode 844题 : 比较含退格的字符串,使用c语言实现。
- 双指针,模拟字符串退格。
- 测试环境:Visual Studio 2019。
二、代码展示
bool backspaceCompare(char * s, char * t){
int i = strlen(s)-1,j = strlen(t) - 1;
int skipS = 0,skipT = 0;
while(i>=0||j>=0){
while(i>=0){
if('#'==s[i]){
skipS++;
i--;
}else if(skipS>0){
skipS--;
i--;
}else{
break;
}
}
while(j>=0){
if('#'==t[j]){
skipT++;
j--;
}else if(skipT>0){
skipT--;
j--;
}else{
break;
}
}
if(i>=0&&j>=0){
if(s[i]!=t[j]){
return false;
}
}else{
if(i>=0||j>=0){
return false;
}
}
i--,j--;
}
return true;
}
三、思路分析
- 栈,后入先出,遇到字母入栈,遇到#,栈顶出栈
- 双指针,同时从右往左遍历s和t,i指s,j指t。
- 设置
s
k
i
p
S
skipS
skipS和
s
k
i
p
T
skipT
skipT,代表当前#的数量,
- 如果遇到字母,
s
k
i
p
=
0
skip=0
skip=0,则比较
s
s
s和
t
t
t的首字母,如果一方有字母,另一方遍历完毕,return false;
- 如果遇到
#
\#
#,
s
k
i
p
skip
skip++;
- 如果遇到字母,且
s
k
i
p
>
0
skip>0
skip>0,
s
k
i
p
skip
skip–,遍历位置–。
- 只有双方同时遍历完毕,return true。
四、代码分析
- 理解思路很重要!
- 欢迎读者在评论区留言,作为日更博主,看到就会回复的。
五、AC
六、复杂度分析
- 时间复杂度:
O
(
n
+
m
)
O(n+m)
O(n+m) ,
n
n
n是
s
s
s的长度,
m
m
m是
t
t
t的长度,同时遍历字符串
s
、
t
s、t
s、t的时间复杂度是
O
(
n
+
m
)
O(n+m)
O(n+m)。
- 空间复杂度:
O
(
1
)
O(1)
O(1),除若干变量使用的常量空间,没有额外使用线性空间。