贪心算法--1

贪心算法

贪心算法是寻找当前状态下的最优解,而动态规划是寻找在所有的状态下的最优解,并且动态规划往往可以和递归关联起来

例如,在一串都是小写字母的字符串中找出字典序最小的不重复的字符序列
比如目标字符串是 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;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值