String - 316. Remove Duplicate Letters

时间:2022-07-25
本文章向大家介绍String - 316. Remove Duplicate Letters,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

316. Remove Duplicate Letters

Given a string which contains only lowercase letters, remove duplicate letters so that every letter appear once and only once. You must make sure your result is the smallest in lexicographical order among all possible results.

Example 1:

Input: "bcabc" Output: "abc"

Example 2:

Input: "cbacdcbc" Output: "acdb"

思路:

题目意思是指移除字符串中重复的数字,剩下的字符串是按字典序排序的。可以先遍历一遍数组,记录每个字母出现的次数,然后根据这个数组去组装字符串res,使得这个字符串是字典序,具体细节就是,对于某一位字符,去判断输出结果的最后一位和当前字符大小,以及后面还有没有这个字符。如果说,res的最后一位end大于当前字符char[i],并且后面的字符串还有end这个字符,那么res就应该移除最后一位字符end,否则就保留,继续遍历下一位。

代码:

java:

class Solution {

    public String removeDuplicateLetters(String s) {

        StringBuilder sb = new StringBuilder();
        
        int[] count = new int[26];
        boolean[] used = new boolean[26];
        
        char[] chs = s.toCharArray();
        for (char c : chs) {
            count[ c - 'a']++;
        }
        
        for (char c : chs) {
            count[c - 'a']--;
            if (used[c - 'a']) continue;
            
            while (sb.length() > 0 && sb.charAt(sb.length() - 1) > c &&
                  count[sb.charAt(sb.length() - 1) - 'a'] > 0) {
                used[sb.charAt(sb.length() - 1) - 'a'] = false;
                sb.deleteCharAt(sb.length() - 1);
            }
            
            sb.append(c);
            used[c - 'a'] = true;
        }
        
        return sb.toString();
         
    }
}