记录每日LeetCode 316.去除重复字母 Java实现
题目描述:
给你一个字符串 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();}
}