844-比较含退格的字符串
题目描述
给定 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"。
分析
首先想到的是利用栈的思想完成,分别对 s 和 t 两个字符串进行处理后比较二者是否相同,返回 s==t 即可
题解
/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
var backspaceCompare = function(s, t) {
let l1 = s.split(''), l2 = t.split('');
let ln1 = [], ln2 = [];
l1.map(item=>{
if(item!='#') {
ln1.push(item)
} else {
ln1.pop()
}
})
l2.map(item=>{
if(item!='#') {
ln2.push(item)
} else {
ln2.pop()
}
})
s = ln1.join('');
t = ln2.join('');
return s==t;
};
分析
时间复杂度:O(m+n)
空间复杂度:O(m+n)
优化 - 双指针
从后向前双指针:同时从后向前遍历S和T(i初始为S末尾,j初始为T末尾),记录#的数量,模拟消除的操作,如果#用完了,就开始比较S[i]和S[j]。
如果S[i]和S[j]不相同返回false,如果有一个指针(i或者j)先走到的字符串头部位置,也返回false。
/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
var backspaceCompare = function(s, t) {
let sSkipNum = 0, tSkipNum = 0;
let i = s.length - 1, j = t.length - 1;
while(1) {
while(i>=0) {
if(s[i] == '#') {
sSkipNum++;
} else {
if(sSkipNum>0) sSkipNum--;
else break;
}
i--;
}
while(j>=0) {
if(t[j] == '#') {
tSkipNum++;
} else {
if(tSkipNum>0) tSkipNum--;
else break;
}
j--;
}
if(i<0 || j<0) break;
if(s[i] != t[j]) return false;
i--;
j--;
}
if(i==-1 && j==-1) return true;
return false;
};