方法一 暴力法:
对两个字符串分别从头到尾遍历一遍,遇到#就删除#和它之前的那个字符,如果遇到#在字符串的第一位则只用删除#,最后将删除后的不含#的两个字符串进行比较是否一样
var backspaceCompare = function(s, t) {
for(var i=0;i<s.length;i++){
if(s[i]==='#'){
if(i===0){
s=s.slice(1);
i--;
}else{
s=s.slice(0,i-1)+s.slice(i+1);
i-=2 ;
}
}
}
for(var i=0;i<t.length;i++){
if(t[i]==='#'){
if(i===0){
t=t.slice(1);
i--;
}else{
t=t.slice(0,i-1)+t.slice(i+1);
i-=2;
}
}
}
return s===t;
};
消耗时间和内存:
方法二 双指针法:
两个指针分别指向s和t的尾部,从尾部开始每一位进行比较, 碰到#时用skip++代表要跳过一位进行比较,变相相当于删除了#之前那一个字符。若对比过程出现 S, T 当前字符不匹配,则遍历结束,返回 false,若 S,T 都遍历结束,且都能一一匹配,则返回 true。
var backspaceCompare = function(S, T) {
let i = S.length - 1,
j = T.length - 1,
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(S[i] !== T[j]) return false;
i--;
j--;
}
return true;
}
消耗时间和内存:?
?
方法三 栈:
和方法一类似,从前往后遍历,遇到字符先push进数组,遇到#就把数组最后一个元素移出,最后把两个数组转为字符串比较是否相同
var backspaceCompare = function(S, T) {
var a=[],b=[]
for(var i=0;i<S.length;i++){
if(S[i]==='#'){
a.pop()
}else{
a.push(S[i])
}
}
for(var i=0;i<T.length;i++){
if(T[i]==='#'){
b.pop()
}else{
b.push(T[i])
}
}
return a.join('')===b.join('')
}
消耗时间和内存:?
总体来说,三种方法耗时差不多