代码改变世界

[LeetCode] 844. Backspace String Compare_Easy tag: Stack, Two pointers

2018-08-18 10:52  Johnson_强生仔仔  阅读(260)  评论(0编辑  收藏  举报

Given two strings S and T, return if they are equal when both are typed into empty text editors. # means a backspace character.

Example 1:

Input: S = "ab#c", T = "ad#c"
Output: true
Explanation: Both S and T become "ac".

Example 2:

Input: S = "ab##", T = "c#d#"
Output: true
Explanation: Both S and T become "".

Example 3:

Input: S = "a##c", T = "#a#c"
Output: true
Explanation: Both S and T become "c".

Example 4:

Input: S = "a#c", T = "b"
Output: false
Explanation: S becomes "c" while T becomes "b".

Note:

  1. 1 <= S.length <= 200
  2. 1 <= T.length <= 200
  3. S and T only contain lowercase letters and '#' characters.

Follow up:

  • Can you solve it in O(N) time and O(1) space?

 

建一个helper function, 然后用stack, 如果为'#', 就stack.pop(), 否则append(c), 最后返回"".join(stack).  T: O(m+n)    S: O(m+n)

 

**imporve, 可以用two pointers 去实现 T: O(m+n)   S: O(1)

 

Code 1: using stack ; T: O(m + n)   S: O(max(m, n))

class Solution:
    def backspaceStringCompare(self, S, T):
        def helper(s):
            stack = []
            for c in s:
                if c == '#' and stack:
                    stack.pop()
                elif c != '#':
                    stack.append(c)
            return "".join(stack)
        return helper(S) == helper(T)

 

Code 2: using two pointers ; T: O(m+n)   S: O(1)

class Solution:
    def backspaceCompare(self, s: str, t: str) -> bool:
        m, n = len(s), len(t)
        i_m, i_n = m - 1, n - 1
        count_m , count_n = 0, 0
        while i_m >= 0 or i_n >= 0:
            while i_m >= 0 and (count_m > 0 or s[i_m] == '#'):
                if s[i_m] == '#':
                    count_m += 1
                else:
                    count_m -= 1
                i_m -= 1
            while i_n >= 0 and (count_n > 0 or t[i_n] == '#'):
                if t[i_n] == '#':
                    count_n += 1
                else:
                    count_n -= 1
                i_n -= 1
            if i_m >= 0 and i_n >= 0 and s[i_m] != t[i_n]:
                    return False
            if ((i_m >= 0) != (i_n >= 0)):
                return False
            i_m -= 1
            i_n -= 1
        return True