【Leetcode】1081. Smallest Subsequence of Distinct Characters

記錄演算法發表於2020-11-30

題目地址:

https://leetcode.com/problems/smallest-subsequence-of-distinct-characters/

給定一個字串 s s s,要求返回其包含全部字母(每個字母只包含一個)且字典序最小的子序列。題目保證 s s s只含英文小寫字母。

思路是單調棧。參考https://blog.csdn.net/qq_46105170/article/details/108793778。程式碼如下:

class Solution {
    public String smallestSubsequence(String s) {
    	// 求一下每個字母最後出現的位置
        int[] pos = new int[26];
        for (int i = 0; i < s.length(); i++) {
            pos[s.charAt(i) - 'a'] = i;
        }
        
        boolean[] used = new boolean[26];
        StringBuilder sb = new StringBuilder();
        
        for (int i = 0; i < s.length(); i++) {
        	// sb裡包含的字母直接跳過
            if (used[s.charAt(i) - 'a']) {
                continue;
            }
            
            // 維護棧的嚴格單調遞增性
            while (sb.length() > 0 && sb.charAt(sb.length() - 1) > s.charAt(i) && pos[sb.charAt(sb.length() - 1) - 'a'] > i) {
                used[sb.charAt(sb.length() - 1) - 'a'] = false;
                sb.setLength(sb.length() - 1);
            }
            
            sb.append(s.charAt(i));
            used[s.charAt(i) - 'a'] = true;
        }
        
        return sb.toString();
    }
}

時空複雜度 O ( l s ) O(l_s) O(ls)

相關文章