# Middle-题目98：316. Remove Duplicate Letters

118人阅读 评论(0)

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), ""));
}
}

0
0

* 以上用户言论只代表其个人观点，不代表CSDN网站的观点或立场
个人资料
• 访问：63728次
• 积分：3278
• 等级：
• 排名：第10731名
• 原创：270篇
• 转载：53篇
• 译文：0篇
• 评论：8条
文章分类
阅读排行
最新评论