JAVA练习91-最长快乐字符串

如果字符串中不含有任何 'aaa','bbb' 或 'ccc' 这样的字符串作为子串,那么该字符串就是一个「快乐字符串」。

给你三个整数 a,b ,c,请你返回 任意一个 满足下列全部条件的字符串 s:

  • s 是一个尽可能长的快乐字符串。
  • s 中 最多 有a 个字母 'a'、b 个字母 'b'、c 个字母 'c' 。
  • s 中只含有 'a'、'b' 、'c' 三种字母。
  • 如果不存在这样的字符串 s ,请返回一个空字符串 ""。

示例 1:
输入:a = 1, b = 1, c = 7
输出:"ccaccbcc"
解释:"ccbccacc" 也是一种正确答案。

示例 2:
输入:a = 2, b = 2, c = 1
输出:"aabbc"

示例 3:
输入:a = 7, b = 1, c = 0
输出:"aabaa"
解释:这是该测试用例的唯一正确答案。

提示:

  • 0 <= a, b, c <= 100
  • a + b + c > 0

分析:

方法:贪心算法

要想满足 s 尽可能长,那么 a b c 的数量分配就要足够均匀,即 a b c 每个的数量相同时,s 最大。只要我们让每个数量趋近相同就可以了,那么我们可以每次挑选 数量最多 的字母来组成字符串,这样就能消减数量最多的字母使所有字母数量趋近一样,但是相同字母最多连续两个,所以需要记录上一个字母和它的出现次数,如果已经俩个,那么我们从剩下两个字母中挑选最大添加到字符串中,如果没有就结束。

时间复杂度:O(a+b+c)         a b c 为三个字母的数量
空间复杂度:O(C)        C 为 3

class Solution {
    //记录每个字母的数量
    int[] nums;

    public String longestDiverseString(int a, int b, int c) {
        nums = new int[]{a, b, c};
        //定义三字母
        char[] cs = new char[]{'a', 'b', 'c'};
        //定义StringBuilder 存储结果
        StringBuilder sb = new StringBuilder();
        //定义前字母以及该字母出现次数
        int letter = -1, count = 0;
        //遍历
        for(int i = 0; i < a + b + c; ++i){
            //获取数量最大的字母
            int max = max();
            //字母和前字母不一样,添加该字母,并重置前字母和次数
            if(letter != max){
                sb.append(cs[max]);
                count = 1;
                nums[max]--;
                letter = max;
            }
            //字母和前字母一样,但次数小于2,添加该字母,次数加一
            else if(count < 2){
                sb.append(cs[max]);
                count++;
                nums[max]--;
            }
            //字母和前字母一样且次数大于等于2,添加除该字母外的最大数量字母,若没有结束循环,若有重置前字母和次数
            else{
                int temp = nums[max];
                nums[max] = 0;
                int m = max();
                //其他字母次数都为0
                if(m == -1){
                    break;
                }
                sb.append(cs[m]);
                nums[m]--;
                nums[max] = temp;
                count = 1;
                letter = m;
            }
        }
        return sb.toString();
    }

    //获取次数最大的字母索引
    public int max(){
        //三个字母次数都为0
        if(nums[0] == 0 && nums[1] == 0 && nums[2] == 0){
            return -1;
        }
        //a 的次数最多
        if(nums[0] >= nums[1] && nums[0] >= nums[2]){
            return 0;
        }
        //b 的次数最多
        if(nums[1] > nums[0] && nums[1] >= nums[2]){
            return 1;
        }
        //c 的次数最多
        return 2;
    }
}

题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-happy-string

你可能感兴趣的:(Java练习,java,算法,leetcode,贪心算法,数组)