一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情。
题目描述
给定 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"。
思路分析
从题目知道#只会删除左边字母,对右边的字母毫无影响,所以,我们可以从右边开始循环,记录下#出现的次数,根据#的次数来消除左边的字母;这里需要三个循环,大循环包含着两个小循环,大循环是用来判断两个目标是否相等的;两个字符串需要分开循环,所以需要两个小循环;从右往左循环的时候,判断当前字符时#时,numS自增1;若当前字符不是#并且num不是0,那么numS减1;若当前的字母不是#并且numS是0,那么我们就可以用它和另一个字符串的当前字母作比较;若是在循环比较中两个字符串的当前字母不相等,则直接return false并结束循环;若是等循环结束后,每个循环时的当前字母都能一一匹配,那么就返回true。
AC代码
function equals(S, T) {
let i = S.length - 1,
j = T.length - 1,
numS = 0,
numT = 0;
while(i >= 0 || j >= 0){
while(i >= 0){
if(S[i] === '#'){
numS++;
i--;
}else if(numS > 0){
numS--;
i--;
}else break;
}
while(j >= 0){
if(T[j] === '#'){
numT++;
j--;
}else if(numT > 0){
numT--;
j--;
}else break;
}
if(S[i] !== T[j]) return false;
i--;
j--;
}
return true;
};
总结
这道题主要需要从右边开始循环起,若是循环到#并存好数量,这就接下来遇到字符就根据#的数量删除字符。