LeetCode #844 Backspace字串比較

英文原文如下

Given two strings s and t, return true if they are equal when both are typed into empty text editors. ‘#’ means a backspace character.

Note that after backspacing an empty text, the text will continue empty.

中文翻譯

給予兩個字串 st, 回傳 true 要是他們倆個打出來是相等的。 ‘#’ 代表了退格鑑。

要注意的是當對一個空字串退格,其依然會保持為空。

範例及題目限制

Follow up: Can you solve it in O(n) time and O(1) space?

進階: 你的解法可以用 O(n)的時間複雜度 以及  O(1)的空間複雜度嗎?


解題思路

在第一個解法中,我們可以使用一個簡單的迴圈來模擬打字的動作,就一個一個加上去,遇到 # 字號再進行判斷!

C# 解決方案

💔方案1

public class Solution {
    public bool BackspaceCompare(string s, string t) {
        
        string s2 = "";
        int cnt = 0;

        foreach(var a in s){
            if(a == '#'){
                if(cnt>0){
                    cnt-=1;
                    s2 = s2.Substring(0,cnt);
                }

            } else{
                s2 = s2+a;
                cnt+=1;
            }
        }


        string t2 = "";
        cnt = 0;

        foreach(var a in t){
            if(a == '#'){
                if(cnt>0){
                    cnt-=1;
                    t2 = t2.Substring(0,cnt);
                }

            } else{
                t2 = t2+a;
                cnt+=1;
            }
        }
        return s2 == t2;
    }
}

其中 cnt 是用來判斷當前字串有沒有值的 (要是空字串則不採取行動)

這個寫法可以成功的跑出答案沒問題,但還有一些地方可以優化

  • 第一,有很多重複的程式碼,可以直接寫成另一支function來呼叫
  • 其二,針對字串重複拼裝對於整體的記憶體空間相當不利,改用 StringBuilder 可以大幅降低這個損耗。

方案2

public class Solution {
    public bool BackspaceCompare(string s, string t) {
       return BackspaceString(s) == BackspaceString(t);
    }

    private string BackspaceString(string input) {
        var result = new StringBuilder();
        int cnt = 0;    

        foreach (char c in input) {
            if (c == '#') {
                if (cnt > 0) {
                    result.Length--;
                    cnt--;
                }
            } else {
                result.Append(c);
                cnt++;
            }
        }

        return result.ToString();
    }
}

Java解決方案

方案1

class Solution {
    public boolean backspaceCompare(String s, String t) {
        return backspaceString(s).equals(backspaceString(t));
    }

    private String backspaceString(String input) {
        StringBuilder result = new StringBuilder();

        for (char c : input.toCharArray()) {
            if (c == '#') {
                if (result.length() > 0) {
                    result.setLength(result.length() - 1);
                }
            } else {
                result.append(c);
            }
        }

        return result.toString();
    }
}

Python3 解決方案

方案1

class Solution:
    def backspaceString(self,input):
        result = []
        
        for c in input:
            if c == '#':
                if result:
                    result.pop()
            else:
                result.append(c)
        
        return ''.join(result)

    def backspaceCompare(self, s: str, t: str) -> bool:
        return self.backspaceString(s) == self.backspaceString(t)

Python當中沒有StringBuilder,故用一個list來模擬其動作

JavaScript 解決方案

方案1

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var backspaceCompare = function(s, t) {
    return backspaceString(s) == backspaceString(t);
};


function backspaceString(input){
    let result = '';

    for (let i = 0; i < input.length; i++) {
        if (input[i] === '#') {
            if (result.length > 0) {
                result = result.slice(0, -1);
            }
        } else {
            result += input[i];
        }
    }

    return result;
}

結論

這個問題其實並不算困難,但其實我的解答並沒有達成進階的條件

空間複雜度的部分,文章的解答都是O(n),猜測可能要使用到two pointer之類的方式

有機會會在補上的

另外,有關於StringBuilder與string的差異,有機會也來寫一篇文章吧!

🧡如果這篇文章有幫上你的一點點忙,那是我的榮幸

🧡收藏文章或幫我點個廣告,那都是對我的支持

✅如有任何疑問,歡迎透過留言或messenger讓我知道 !

題目連結 : Backspace String Compare – LeetCode

其他的LeetCode文章

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *