Leetcode 316. Remove Duplicate Letters
2016-01-27 09:22
246 查看
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
Return
Given
Return
Analysis:这道题是返回一个最小的序列,并且这个序列在原String中存在,我愿意把这道题称为Stack的应用,用Stack维护一个Character的堆栈,将当前满足条件的最小字符入栈,同时弹出那些之前被插入的但是不好的Character.
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), ""));
}
}
在这里使用了Stack
public class Solution {
public String removeDuplicateLetters(String s) {
int[]freqs = new int[256];
for(int i = 0; i < s.length(); i++){
freqs[s.charAt(i) - 'a'] ++;
}
boolean[] visited = new boolean[256];
Stack<Integer> stack = new Stack<Integer>();
for(int i = 0; i < s.length(); i++){
char c = s.charAt(i);
freqs[c - 'a']--;
if(visited[c - 'a']) continue;
while(!stack.isEmpty() && (s.charAt(i) - 'a') < stack.peek() && freqs[stack.peek()] > 0){
visited[stack.pop()] = false;
}
visited[c - 'a'] = true;
stack.push((c - 'a'));
}
StringBuffer result = new StringBuffer();
// for(){
// result.append(c);
// }
while(!stack.isEmpty()){
result.append((char)(stack.pop() + 'a'));
}
return result.reverse().toString();
}
}
Example:
Given
"bcabc"
Return
"abc"
Given
"cbacdcbc"
Return
"acdb"
Analysis:这道题是返回一个最小的序列,并且这个序列在原String中存在,我愿意把这道题称为Stack的应用,用Stack维护一个Character的堆栈,将当前满足条件的最小字符入栈,同时弹出那些之前被插入的但是不好的Character.
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), ""));
}
}
在这里使用了Stack
public class Solution {
public String removeDuplicateLetters(String s) {
int[]freqs = new int[256];
for(int i = 0; i < s.length(); i++){
freqs[s.charAt(i) - 'a'] ++;
}
boolean[] visited = new boolean[256];
Stack<Integer> stack = new Stack<Integer>();
for(int i = 0; i < s.length(); i++){
char c = s.charAt(i);
freqs[c - 'a']--;
if(visited[c - 'a']) continue;
while(!stack.isEmpty() && (s.charAt(i) - 'a') < stack.peek() && freqs[stack.peek()] > 0){
visited[stack.pop()] = false;
}
visited[c - 'a'] = true;
stack.push((c - 'a'));
}
StringBuffer result = new StringBuffer();
// for(){
// result.append(c);
// }
while(!stack.isEmpty()){
result.append((char)(stack.pop() + 'a'));
}
return result.reverse().toString();
}
}
相关文章推荐
- 朋友圈红包照片,花钱看果照,技术不可耻谁看谁流氓?
- Jq获取页面元素的位置
- hdu 1695(欧拉函数+容斥原理)
- -Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME environment variable a
- Ionic APP-Web SPA开发进阶(一)AngularJS全栈工程狮进阶
- Windows 7上QTP11破解及java等插件破解方法
- Ionic APP-Web SPA开发进阶(一)AngularJS全栈工程狮进阶
- Windows 7上QTP11破解及java等插件破解方法
- 经典排序算法 - 基数排序Radix sort
- 单例模式
- 简介Objective-C解析XML与JSON数据格式的方法
- js中的继承与重写
- DataTable转(字符串形式的)json;DataTable转easyui grid可以识别的json结构
- 电容滤波原理
- C#导出Excel,并且设置Excel单元格格式,合并单元格
- 莫比乌斯反演题目泛做(为了对应smz的课件)
- C++11 std::function用法
- python类中self是什么
- 一、SAE
- linux下文件的读写操作(openreadwrite)