简单 | 双指针 | 力扣

一. 题目描述

给定 **s****t** 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回**true****#**代表退格字符。
注意:如果对空文本输入退格字符,文本继续为空。

二. 题目示例

:::tips 输入:s = “ab#c”, t = “ad#c”
输出:true
::: :::tips 输入:s = “ab##”, t = “c#d#”
输出:true
::: :::tips 输入:s = “a#c”, t = “b”
输出:false
:::

三. 题目解答

1. 思路

利用同向倒序双指针,定义 **skip**表示当前待删除的字符的数量。每次我们遍历到一个字符:

  • 若该字符为退格符,则我们需要多删除一个普通字符,我们让 **skip++**
  • 若该字符为普通字符,若 **skip**为 0,则说明当前字符不需要删去,若 **skip**不为 0,则说明当前字符需要删去,我们让**skip--**

    2. 代码

    1. /**
    2. * @param {string} s
    3. * @param {string} t
    4. * @return {boolean}
    5. */
    6. var backspaceCompare = function(s, t) {
    7. let skipS=0, p1=s.length-1;
    8. let skipT=0, p2=t.length-1;
    9. while(p1>=0 || p2>=0){
    10. while(p1 >= 0){
    11. //处理掉#
    12. if(s[p1] == '#'){
    13. skipS++;
    14. p1--;
    15. }else if(skipS > 0){
    16. // 不是#但有退格数
    17. skipS--;
    18. p1--;
    19. }else {
    20. // 不是#也没有退格数 需要退出比较
    21. break;
    22. }
    23. }
    24. while(p2 >= 0){
    25. if(t[p2] == '#'){
    26. skipT++;
    27. p2--;
    28. } else if(skipT > 0){
    29. skipT--;
    30. p2--;
    31. } else {
    32. break;
    33. }
    34. }
    35. if (s[p1]==t[p2]){
    36. p1--;
    37. p2--;
    38. } else {
    39. return false;
    40. }
    41. }
    42. return true;
    43. };