题目链接

题目描述

给定 ST 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果。 # 代表退格字符。
注意:如果对空文本输入退格字符,文本继续为空。

示例

示例1:

输入:S = “ab#c”, T = “ad#c” 输出:true 解释:S 和 T 都会变成 “ac”。

提示

  • 1 <= S.length <= 200
  • 1 <= T.length <= 200
  • ST 只含有小写字母以及字符 '#'

    思路

    思路1:栈模拟

    遍历字符串,从头开始入栈,遇到 # 就弹出一个字符,最后比较得出的两个字符串。

    思路2:双指针

    因为 # 只与其左边的字符有关,所以考虑逆序遍历。维护两个变量 backspaceSbackspaceT ,以字符串 s 为例,在遍历过程中:

  • 遇到 # 时,backspaceS++

  • 如果遇到字符且 backspaceS 不为0,backspaceS--
  • 如果遇到字符且 backspaceS 为0,说明当前字符不会被删除,可以与 字符串 t 比较。

    题解

    思路1:栈模拟

    1. class Solution {
    2. private:
    3. string processString(string s) {
    4. string ret;
    5. for (char ch : s) {
    6. if (ch != '#') {
    7. ret.push_back(ch);
    8. } else if (!ret.empty()) {
    9. ret.pop_back();
    10. }
    11. }
    12. return ret;
    13. }
    14. public:
    15. bool backspaceCompare(string s, string t) {
    16. return processString(s) == processString(t);
    17. }
    18. };

    思路2:双指针

    1. class Solution {
    2. public:
    3. bool backspaceCompare(string s, string t) {
    4. int i = s.size() - 1;
    5. int j = t.size() - 1;
    6. int backspaceS = 0, backspaceT = 0;
    7. while (i >= 0 || j >= 0) {
    8. while (i >= 0) {
    9. if (s[i] == '#') {
    10. ++backspaceS;
    11. --i;
    12. } else if (backspaceS > 0) {
    13. --backspaceS;
    14. --i;
    15. } else {
    16. break;
    17. }
    18. }
    19. while (j >= 0) {
    20. if (t[j] == '#') {
    21. ++backspaceT;
    22. --j;
    23. } else if (backspaceT > 0) {
    24. --backspaceT;
    25. --j;
    26. } else {
    27. break;
    28. }
    29. }
    30. if (i >= 0 && j >= 0) { // 两个字符串都不为空
    31. if (s[i] != t[j]) { // 有不相等的元素
    32. return false;
    33. }
    34. } else { // 至少有一个不为空
    35. if (i >= 0 || j >= 0) { // 只有一个不为空
    36. return false;
    37. }
    38. }
    39. --i;
    40. --j;
    41. }
    42. return true;
    43. }
    44. };

    复杂度分析

    思路1:栈模拟

  • 时间复杂度:0844-比较含退格的字符串 - 图1

  • 空间复杂度:0844-比较含退格的字符串 - 图2

    思路2:双指针

  • 时间复杂度:0844-比较含退格的字符串 - 图3

  • 空间复杂度:0844-比较含退格的字符串 - 图4

0844-比较含退格的字符串 - 图5