leetcode316去除重复字母

leetcode 316 Remove Duplicate Letters

Posted by BY on July 23, 2020

前言

持续更新了

正文

问题来源

本问题来自leetcode上的316题。

问题描述

给你一个仅包含小写字母的字符串,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证返回结果的字典序最小(要求不能打乱其他字符的相对位置)。

示例 1:

输入: "bcabc"
输出: "abc"

示例 2:

输入: "cbacdcbc"
输出: "acdb"

分析:

先遍历字符串,记录每个元素出现次数
接着元素挨个入栈,
维持栈的核心要素是:保持栈内所有元素都小于即将进栈的元素,即字典序
如果不满足,则需要把栈内元素出栈,直到满足要求为止

func removeDuplicateLetters(s string) string {
    exist := make([]bool, 26)
    stack := make([]byte, 0)
    count := make([]int, 26)
    for i := 0; i < len(s); i++ {
        count[s[i]-'a']++
    }
    for i := 0; i < len(s); i++ {
        index := s[i]-'a'
        if exist[index] {
            count[index]--
            continue
        }
        // 出栈的核心判断要素:
        // 1. 栈里有元素
        // 2. 栈顶元素大于当前元素c
        // 3. 栈顶元素在后续出现
        for len(stack) > 0 && stack[len(stack)-1] > s[i] && count[stack[len(stack)-1]-'a'] > 0 {  // 循环出栈判断
            exist[stack[len(stack)-1]-'a'] = false
            stack = stack[:len(stack)-1]
        }
        stack = append(stack, s[i])
        count[index]--
        exist[index] = true
    }
    return string(stack)
}

总结:

勤思考。

结语

不管怎么样好好加油。