Middle-题目98：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:
Given “bcabc”
Return “abc”

Given “cbacdcbc”
Return “acdb”

public class Solution {
public String removeDuplicateLetters(String s) {
/**
* First loop: use an array cnt[] to count the number of times
* appeared for each letter in s.
*
* Second loop (Greedy): use a stack, pop() while (!stack.isEmpty()
* && (sc = stack.peek()) >= c && cnt[sc] > 0)
*/

int i, n = s.length();
int[] cnt = new int[128];
boolean[] inRes = new boolean[128]; // whether a char is in res[]
char[] res = s.toCharArray(); // simulate a stack

for (i = 0; i < n; i++)
cnt[res[i]]++;

char c, sc;
int end = -1;
// now cnt[c] means the remaining count of the char c
for (i = 0; i < n; i++) {
c = res[i];
if (inRes[c]) {
cnt[c]--;
continue;
}

while (end >= 0 && (sc = res[end]) >= c && cnt[sc] > 0) {
end--;
inRes[sc] = false;
}

res[++end] = c;
cnt[c]--;
inRes[c] = true;
}
return String.valueOf(res).substring(0, end + 1);
}
}

3ms,beats 95.32%，众数7ms,9.99%
cmershen的碎碎念：

public class Solution {
public String removeDuplicateLetters(String s) {
int[] cnt = new int[26];
int pos = 0; // the position for the smallest s[i]
for (int i = 0; i < s.length(); i++) cnt[s.charAt(i) - 'a']++;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) < s.charAt(pos)) pos = i;
if (--cnt[s.charAt(i) - 'a'] == 0) break;
}
return s.length() == 0 ? "" : s.charAt(pos) + removeDuplicateLetters(s.substring(pos + 1).replaceAll("" + s.charAt(pos), ""));
}
}

• 本文已收录于以下专栏：

举报原因： 您举报文章：Middle-题目98：316. Remove Duplicate Letters 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)