1081. Smallest Subsequence of Distinct Characters

1081. Smallest Subsequence of Distinct Characters

找出只含字母的字符串中的字典序最小的不含重复字符的字符序列

本题的一个关键点是字典序最小,另一个是序列,因此是顺序遍历 然后为了字典序最小,我们需要贪心进行遍历,如果当前构造的子序列的最后字符还可以更小并且它在后面有出现,我们会优先采用更小的字符,然后用一个定长数组来保证不重复

时间复杂度:O(N) 空间复杂度:O(1)

string smallestSubsequence(string text) {
    int count[26] = {};
    int used[26] = {};
	// 扫描一遍进行字符计数
    for(auto c : text) ++count[c-'a'];
    string res = "";
    for(auto c : text) {
		// 去重
        if (used[c-'a']) {
            --count[c-'a'];
            continue;
        }

		// 字符串为空,直接选择
        while(!res.empty() && c < res.back() && count[res.back()-'a']>0) {
			// 去掉字典序大的字符
            used[res.back()-'a']=false;
            res.pop_back();
        }

		// 使用当前字典序最小的字符
        used[c-'a'] = true;
        --count[c-'a'];
        res.push_back(c);
    }
    return res;
}

#string #greedy