一、题目:316. 去除重复字母
给你一个仅包含小写字母的字符串,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证返回结果的字典序最小(要求不能打乱其他字符的相对位置)。
哦豁,我写了一下午一直觉得别人的是错的,最后发现是我自己搞错了,我误解了字典序的含义?!!
“字典序”!!!划重点!
字符串之间比较跟数字之间比较是不太一样的。字符串比较是从头往后一个字符一个字符比较的。哪个字符串大取决于两个字符串中 第一个对应不相等的字符 。根据这个规则,任意一个以 a 开头的字符串都大于任意一个以 b 开头的字符串。
我的理解就是把最小的字符尽可能的放在前面 ,"cbacdcbc"就变成"acdb","bcabc"变成“abc”。
import java.util.Scanner;
import java.util.Stack;
public class Test2 {
public static String del_double(String s) {
Stack<Character>stack = new Stack<Character>();
for(int i=0;i<s.length();i++) {
Character c = s.charAt(i);
if(stack.contains(c)) {
continue;//结束本次循环,但没使本次循环停止
}
//当栈顶元素字符当前字符且后面还有该栈顶元素时,就将其出栈
while(!stack.isEmpty() && stack.peek() > c && s.indexOf(stack.peek(),i)!=-1 ) {
stack.pop();
}
stack.push(c);
}
char[] b = new char[stack.size()];
for(int j=0;j<stack.size();j++) {
b[j] = stack.get(j);
}
return new String(b);//将字符数组转换成字符串
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s = in.next();
in.close();
System.out.println(del_double(s));
}
}
charAt(int index):返回指定索引处的字符;
public int indexOf(int ch, int fromIndex): 返回从 fromIndex 位置开始查找指定字符在字符串中第一次出现处的索引,
如果此字符串中没有这样的字符,则返回 -1;
栈方法:pop():访问栈顶元素,并将其永久删除;\push()\peek():返回栈顶元素\get()。