Loading

比较含退格的字符串

1.问题描述

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

注意:如果对空文本输入退格字符,文本继续为空。

示例 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 = "#a#c"
输出:true
解释:S 和 T 都会变成 “c”。

示例 4:

输入:S = "a#c", T = "b"
输出:false
解释:S 会变成 “c”,但 T 仍然是 “b”。

提示:

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

进阶:

  • 你可以用 O(N) 的时间复杂度和 O(1) 的空间复杂度解决该问题吗?

2.求解

重构字符串

代码如下

/*
 * 执行用时:1 ms, 在所有 Java 提交中击败了96.52% 的用户
 * 内存消耗:36.2 MB, 在所有 Java 提交中击败了99.88% 的用户
 * */
public boolean backspaceCompare(String S, String T) {
    return getBackString(S).equals(getBackString(T));
}

private String getBackString(String s) {
    char[] chars = s.toCharArray();
    StringBuilder s1 = new StringBuilder();
    for (int i = 0, j = 0; i < chars.length; i++) {
        if (chars[i] != '#') {
            s1.append(chars[i]);
        } else {
            if (s1.length() > 0) {
                s1.deleteCharAt(s1.length() - 1);
            }
        }
    }
    return s1.toString();
}
  • 空间复杂度、时间复杂度均为O(N)

代码如下

/*
*执行用时:2 ms, 在所有 Java 提交中击败了74.87% 的用户
* 内存消耗:36.4 MB, 在所有 Java 提交中击败了99.59% 的用户
* */
public boolean backspaceCompare(String S, String T) {
    return getBackString(S).equals(getBackString(T));
}

private LinkedList getBackString(String s) {
    LinkedList l1 = new LinkedList();
    char[] chars = s.toCharArray();
    for (int i = 0, j = 0; i < chars.length; i++) {
        if (chars[i] != '#') {
            l1.push(chars[i]);
        } else {
            if (l1.size() > 0) {
                l1.pop();
            }
        }
    }
    return l1;
}

双指针

  • 分别倒序遍历两个数组,遇见字母则比较,遇见"#"则跳过,并且继续跳过前面的一个字符
  • 若字母不一致直接返回false,若比较到最后说明两字符串相同返回true
  • 当一方字符串遍历完成,另一方还有剩余时,说明不同,返回false

代码如下

 /*
     *执行用时:0 ms, 在所有 Java 提交中击败了100.00% 的用户
     * 内存消耗:36.6 MB, 在所有 Java 提交中击败了97.55% 的用户
     * */
    public boolean backspaceCompare(String S, String T) {
        int backS = 0, backT = 0;
        int i = S.length() - 1, j = T.length() - 1;
        while (i >= 0 || j >= 0) {
            while (i >= 0) {
                if (S.charAt(i) == '#') {
                    backS++;
                    i--;
                } else if (backS > 0) {
                    backS--;
                    i--;
                } else {
                    break;
                }
            }
            while (j >= 0) {
                if (T.charAt(j) == '#') {
                    backT++;
                    j--;
                } else if (backT > 0) {
                    backT--;
                    j--;
                } else {
                    break;
                }
            }
            if (i >= 0 && j >= 0) {
                if (S.charAt(i) != T.charAt(j)) {
                    return false;
                }
            } else {
                if (i >= 0 || j >= 0) {
                    return false;
                }
            }
            j--;
            i--;
        }
        return true;
    }

  • 时间、空间复杂度完成题目要求
posted @ 2020-10-19 20:15  水纸杯  阅读(148)  评论(0)    收藏  举报