【剑指offer】点击消除 [Go语言]

124 阅读1分钟

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即可