问题描述:
给定一个全是小写字母的字符串str,删除多余字符,使得每种字符只保留一个,并让最终结果字符串的字典序最小。
【举例】
str = "acbc",删掉第一个'c',得到"abc",是所有结果字符串中字典序最小的。
str = "dbcacbca",删掉第一个'b'、第一个'c'、第二个'c'、第二个'a',得到"dabc", 是所有结 果字符串中字典序最小的。
思路
使用贪心算法思想。
- 流程统计每个字符的个数 。
- 遍历字符串,每遍历一个字符就在统计的词频表中把该字符的数量减一 。
- 当其中某一个字符的数量被减为0时停止遍历,从其实位置开始到结束位置之间选一个 。
- 最前的字典序最小的字符作为保留字符,在他之前的字符全部删掉,之后的和他相同的字符也删掉。
- 从新进行12步骤直到每个字符都剩一个就找到了字典序最小且无重复字符的字符串。
代码
public static String remove(String str) {
if (str == null || str.length() < 2) {
return str;
}
int[] map = new int[256];
for (int i = 0; i < str.length(); i++) {
map[str.charAt(i)]++;
}
int minACSIndex = 0;
for (int i = 0; i < str.length(); i++) {
if (--map[str.charAt(i)] == 0) {
break;
} else {
minACSIndex = str.charAt(minACSIndex) > str.charAt(i) ? i : minACSIndex;
}
}
return String.valueOf(str.charAt(minACSIndex)) +
remove(str.substring(minACSIndex + 1).
replaceAll(String.valueOf(str.charAt(minACSIndex)), ""));
}
public static void main(String[] args) {
String str = "dbcacbca";
System.out.println(remove(str));
}