C/C++教程

Leetcode:1405、最长快乐字符串

本文主要是介绍Leetcode:1405、最长快乐字符串,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

我看到题目的时候愣了一会,多看几遍才发现,是给定abc的值,让你往字符串里面添加a,b,c三个字符,三个字符不能为连续的三个。

根据提示一,我们知道是要尽可能长,那么看到这种要求,那么我就选择使用贪心来解决这个问题。


贪心的思路是:

        每次选三个字母数字最大的那一个,这样长+长+短+长+长,是字符串尽可能长的核心。

        如果已经是长+长了,现在还是长的那个数字是最大的,那么我们依次向下选择第二长的,如果第二长的数字是0,那么就第三长,如果连第三长都是0,那么就直接结束循环。

class Solution {
        public String longestDiverseString(int a, int b, int c) {
        String str = "";
        char ch[] = {'a','b','c'};
        while(true){
            //a最大的情况
            if(a>=b && a>=c){
                //先判断前两位不能是aa
                if(str.length()>=2 && str.substring(str.length()-2,str.length()).equals("aa")){
                    //如果前两位是aa了,就找第二大的
                    if(b>c && b!=0){
                        //第二大不能为0,如果为0,那么也就是第二大和第三大都是零,已经是最长的快乐字符串了
                        str += ch[1];
                        b--;
                    }else if(c!=0){
                        str += ch[2];
                        c--;
                    }else{
                        //至于这里为什么是使用a--,来让他自己达到结束循环的条件判断呢?
                        //因为我发现这里使用break;来结束循环,好像执行用时更多?
                        //不过我这题解本来就差了,break和自减随意就好~
                        a--;
                    }
                }else{
                    str += ch[0];
                    a--;
                }
            }
            //额外判断,当abc都为零,就结束循环
            if(a==0&&b==0&&c==0){
                break;
            }
            //b最大的情况
            if(b>=a && b>=c){
                //先判断前两位不能是bb
                if(str.length()>=2 && str.substring(str.length()-2,str.length()).equals("bb")){
                    //如果前两位是aa了,就找第二大的
                    if(a>c && a!=0){
                        //第二大不能为0,如果为0,那么也就是第二大和第三大都是零,已经是最长的快乐字符串了
                        str += ch[0];
                        a--;
                    }else if(c!=0){
                        str += ch[2];
                        c--;
                    }else{
                        b--;
                    }
                }else{
                    str += ch[1];
                    b--;
                }
            }
            //额外判断,当abc都为零,就结束循环
            if(a==0&&b==0&&c==0){
                break;
            }
            //c最大的情况
            if(c>=b && c>=a){
                //先判断前两位不能是cc
                if(str.length()>=2 && str.substring(str.length()-2,str.length()).equals("cc")){
                    //如果前两位是aa了,就找第二大的
                    if(a>b && a!=0){
                        //第二大不能为0,如果为0,那么也就是第二大和第三大都是零,已经是最长的快乐字符串了
                        str += ch[0];
                        a--;
                    }else if(b!=0){
                        str += ch[1];
                        b--;
                    }else{
                        c--;
                    }
                }else{
                    str += ch[2];
                    c--;
                }
            }
            //额外判断,当abc都为零,就结束循环
            if(a==0&&b==0&&c==0){
                break;
            }
        }
        return str;
    }
}

很菜,很拉的题解~

 

这篇关于Leetcode:1405、最长快乐字符串的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!