LeetCode 75 —— 844. 比较含退格的字符串

80 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第30天,点击查看活动详情

LeetCode 75 —— 844. 比较含退格的字符串

一、题目描述:

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

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

示例 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 = "b"

输出:false

解释:s 会变成 "c",但 t 仍然是 "b"。

提示:

1 <= s.length, t.length <= 200

s 和 t 只含有小写字母以及字符 '#'

进阶:

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

来源:力扣(LeetCode)

链接:leetcode.cn/problems/ba…

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析:

  1. 这道题考察了什么思想?你的思路是什么?

    我的第一思路就是遍历字符串然后遇到#我们就将#即前面的字符裁剪掉。

    但是这样会出现一些问题,我们下面第二栏细说。所以我们可以设置一个byte切片,将不是#和不是#前面的字符放入该切片中即可。

    具体操作如下:

    1. 遍历字符串,如果字符不等于#,我们就放入切片。
    1. 如果等于#,我们不但不放入切片,还将该#前面位置的字符从字符串中去掉。
  2. 做题的时候是不是一次通过的,遇到了什么问题,需要注意什么细节?

    不是,Go使用for range遍历字符串的时候,是在遍历时开辟两块内存以值覆盖的方式将遍历得到的数据放入。

    如果我们这样写:

    func backspaceCompare(s string, t string) bool { 
        s_bak := s
        for i := range s_bak{
            if s_bak[i] == '#'{
                s = s[:i-1] + s[i+1:]
            }
        }
    ​
        fmt.Println(s)
        return true
    }
    

    就会导致字符串在裁剪一次后,字符串s的长度变化了,但是i的范围没有变化,所以这种情况下肯定会导致数组越界。

  3. 有几种解法,哪种解法时间复杂度最低,哪种解法空间复杂度最低,最优解法是什么?其他人的题解是什么,谁的效率更好一些?用不同语言实现的话,哪个语言速度最快?

image.png

image.png

    func backspaceCompare(s, t string) bool {
        skipS, skipT := 0, 0
        i, j := len(s)-1, len(t)-1
        for i >= 0 || j >= 0 {
            for i >= 0 {
                if s[i] == '#' {
                    skipS++
                    i--
                } else if skipS > 0 {
                    skipS--
                    i--
                } else {
                    break
                }
            }
            for j >= 0 {
                if t[j] == '#' {
                    skipT++
                    j--
                } else if skipT > 0 {
                    skipT--
                    j--
                } else {
                    break
                }
            }
            if i >= 0 && j >= 0 {
                if s[i] != t[j] {
                    return false
                }
            } else if i >= 0 || j >= 0 {
                return false
            }
            i--
            j--
        }
        return true
    }
    ​
    作者:LeetCode-Solution
    链接:https://leetcode.cn/problems/backspace-string-compare/solution/bi-jiao-han-tui-ge-de-zi-fu-chuan-by-leetcode-solu/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

三、AC 代码:

func backspaceCompare(s string, t string) bool { 
    return helper(s) == helper(t)
}
​
func helper(s string) string{
    S := []byte{}
    for i := range s{
        if s[i] != '#'{
            S = append(S,s[i])            
        }else if len(S) > 0 {
            S = S[:len(S)-1]
        }
    }
    return string(S)
}

四、总结:

双指针法没太看懂,做好笔记,以后好搬小板凳来复习!如果有大佬能够解释一下,我肯定会很高兴的!!求求大佬指教啦~

模板来源:

作者:掘金酱

链接:juejin.cn/post/706970…

来源:稀土掘金

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。