贪心算法
贪心算法是寻找当前状态下的最优解,而动态规划是寻找在所有的状态下的最优解,并且动态规划往往可以和递归关联起来
例如,在一串都是小写字母的字符串中找出字典序最小的不重复的字符序列
比如目标字符串是 cbacdcbc ,而我们的结果字符序列就是 acdb
我们需要使用贪心算法来解决这个问题
这个问题的关键就是如何知道它是字典序最小,字典序最小就是按照我们查字典的顺序,出现的越前的越小
首先我们需要遍历一遍数组来记录出现过的字符和它们的数量,然后我们依次寻找出字符ascll编码最小的字符,最后将所有的查找出来的字符拼串输出
我们每一次都只需要寻找出当前字符串中不会使得字符串缺失的最小字符,所以我们使用循环或者是递归都可以解决这个问题
递归版本
String remove(String s){
if(s.length()<=1)
return s;
int[] flag = new int[26];
char[] letter = s.toCharArray();
//标识字母的数量
for(char l: letter){
flag[l-'a']++;
}
int local = 0;
for(int i=0;i<s.length();i++){
//寻找最小的字典序的位置,即寻找最小字母的第一个位置
if(s.charAt(i)<s.charAt(local))
local = i;
//退出的条件,即一个出现过的字母已经在之前全部出现了,后面已经没有了
//此时的local就是最小字典序的最小字母的位置
/**
* 这里是关键
*/
if(--flag[s.charAt(i)-'a']<=0)
break;
}
//此方法就是寻找出最小字典序的最小字母
//因此我们使用递归来一个一个寻找出每个字母
//将之前出现的最小字母从递归的参数中去掉
return s.charAt(local) + remove(s.substring(local + 1).replace("" + s.charAt(local), ""));
}
循环版本
String solution(String s){
int[] flag = new int[26];
char[] letter = s.toCharArray();
for(char l : letter){
flag[l-'a']++;
}
int num = 0;
for(int number : flag){
if(number!=0)
num++;
}
String str = "";
for(int i=0; i< num;i++){
int local = 0;
for(int j=0;j<s.length();j++){
if(s.charAt(local)>s.charAt(j)){
local = j;
}
if(--flag[s.charAt(j)-'a']<=0)
break;
}
str = str + s.charAt(local);
s = s.substring(local + 1).replace(s.charAt(local) + "", "");
}
return str;
}