题目:
给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果。 # 代表退格字符。
注意:如果对空文本输入退格字符,文本继续为空。
输入:S = "ab#c", T = "ad#c" 输出:true 解释:S 和 T 都会变成 “ac”。
来源:力扣(LeetCode)
解:
这道题第一种方法,重构字符串。双指针滑动检查字符,当遍历遇到非'#'时保存至新字符数组尾指针,否则尾指针退一个值(表示删除,注意溢出问题)。最后比较新字符数组是否相等。时间O(n),空间O(1),如果字符串转数组不计算空间的话。当然,也有人用栈来做,就是浪费内存而已。
class Solution {
public boolean backspaceCompare(String S, String T) {
char[] rss=S.toCharArray();
char[] rst=T.toCharArray();
//字符遍历检查,重构
int s=0;
for(int i=0;i<rss.length;i++){
if(rss[i]!='#'){
rss[s++]=rss[i];
}else{
s--;
if(s<0){
s=0;
}
}
}
int t=0;
for(int i=0;i<rst.length;i++){
if(rst[i]!='#'){
rst[t++]=rst[i];
}else{
t--;
if(t<0){
t=0;
}
}
}
//相等判断,由于有尾部冗余,所以直接遍历判断
if(t!=s){
return false;
}
for(int i=0;i<s;i++){
if(rss[i]!=rst[i]){
return false;
}
}
return true;
}
}
第二种方法,这道题中,字符串所有删除字符'#'已经确定,'#'就删前一个有效字符,而'#'后面的必定是存在的,相同又要求所有保留字符都相等,即尾部字符相等。所以用双数组双指针,逆序遍历比较,相同则下一个,不同则直接返回false,遇到'#'则向前滑动相应步数。
时间复杂度O(n),空间复杂度O(1),注意如果碰到不相同的情况,可能前几个字符直接就返回了,时间O(1),这就是为什么这个算法优于重构算法的原因。
代码略。