Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情
描述
牛牛拿到了一个字符串。
他每次“点击”,可以把字符串中相邻两个相同字母消除,例如,字符串"abbc"点击后可以生成"ac"。
但相同而不相邻、不相同的相邻字母都是不可以被消除的。
牛牛想把字符串变得尽可能短。他想知道,当他点击了足够多次之后,字符串的最终形态是什么?
输入描述:
一个字符串,仅由小写字母组成。(字符串长度不大于300000)
输出描述:
一个字符串,为“点击消除”后的最终形态。若最终的字符串为空串,则输出0。
示例1
输入:
abbc
输出:
ac
示例2
输入:
abba
输出:
0
示例3
输入:
bbbbb
输出:
b
思路
这其实是一个栈的思想,先入栈的元素和栈顶元素对比,如果一样的话,就把栈顶元素去掉。
AC Code
package main
import "fmt"
func main(){
var str string
(1) fmt.Scan(&str)
(2) stack := make([]rune,0)
(3) for _,v:=range str{
(4) if len(stack)==0 || stack[len(stack)-1] != v{
(5) stack = append(stack, v)
}else{
(6) stack = stack[:len(stack)-1]
}
}
(7) if len(stack) == 0 {
fmt.Println(0)
return
}
(8) fmt.Print(string(stack))
}
- (1) 输入字符串
- (2) 初始化一个栈
- (3) 循环遍历这个字符串
- (4) 如果这个栈是空的,或者这个栈顶元素不等于这个入栈元素
- (5) 就让这个元素入栈
- (6) 否则就去除这个栈顶元素
- (7) 如果这个栈长度等于0的,就直接打印0
- (8) 如果这个栈不为空,打印这个stack即可