记录每日LeetCode 316.去除重复字母 Java实现

2023-12-13 09:56:18

题目描述:

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

初始代码:

class Solution {
    public String removeDuplicateLetters(String s) {

    }
}

示例1:

输入:s = "bcabc"

输出: "abc"

示例2:

输入:s = "cbacdcbc"

输出: "acdb"

参考答案:

class Solution {
    public String removeDuplicateLetters(String s) {
        // 记录每个字母是否不存在更多
        boolean[] isNotMore = new boolean[26];
        // 记录每个字母出现的个数
        int[] count = new int[26];
        for (int i = 0; i < s.length(); ++i) {
            count[s.charAt(i) - 'a']++;
        }
        // 对字符串进行遍历拼接
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < s.length(); ++i) {
            char c = s.charAt(i);
            if (!isNotMore[c - 'a']) {
                // 为了保证字典序小 故需要在各字符保证一个情况下递增ASCII码
                while (sb.length() > 0 && sb.charAt(sb.length() - 1) > c) {
                    // 字母后续还有则删除前面出现的 保证递增ASCII码 否则跳出while循环
                    if (count[sb.charAt(sb.length() - 1) - 'a'] > 0) {
                        isNotMore[sb.charAt(sb.length() - 1) - 'a'] = false;
                        sb.deleteCharAt(sb.length() - 1);
                    } else {
                        break;
                    }
                }
                // 程序走到这代表ASCII码递增 且后续出现相同字符无需进入if中
                isNotMore[c - 'a'] = true;
                sb.append(c);
            }
            count[c - 'a'] -= 1;
        }
        return sb.toString();
    }
}

文章来源:https://blog.csdn.net/m0_65563175/article/details/134828892
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。