题目:给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true 。# 代表退格字符。
注意:如果对空文本输入退格字符,文本继续为空。
解法一
首先想到的是新建一个切片类型遍历字符串中的每个元素判断是否为退格“#”,如果不是就将当前遍历到的字符压入栈中,如果是“#”,就将切片取到切片长度-1的位置, 等同于删除“#”的前一个元素。具体实现打码如下:
func backspaceCompare(s string, t string) bool {
return build(s) == build(t)
}
func build(str string) string {
s := []byte{}
for i := range str {
if str[i] != '#' {
s = append(s, str[i])
} else if len(s) != 0 {
s = s[:len(s)-1]
}
}
return string(s)
}
但是此解法时间复杂度和空间复杂度较高,
- 时间复杂度:O(N+M)
- 空间复杂度:O(N+M)
解法二
观看题解之后了解到另外一种解法,是我想不到的解法了
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
}