C#에서 Leetcode 문제 해결 - 가장 긴 해피 문자열

4948 단어

가장 긴 행복한 문자열



하위 문자열로 'aaa', 'bbb' 또는 'ccc' 문자열이 없으면 문자열을 happy라고 합니다.

세 개의 정수 a, b 및 c가 주어지면 다음 조건을 충족하는 문자열 s를 반환합니다.
  • s는 행복하고 가능한 한 가장 길다.
  • s에는 문자 'a'가 최대 a번 발생하고 문자 'b'가 최대 b번 발생하고 문자 'c'가 최대 c번 발생합니다.
  • s에는 'a', 'b' 및 'c' 문자만 포함됩니다.
  • 그러한 문자열이 없으면 s는 빈 문자열 ""을 반환합니다.

  • 예 1:




    Input: a = 1, b = 1, c = 7
    Output: "ccaccbcc"
    Explanation: "ccbccacc" would also be a correct answer.
    
    


    예 2:




    Input: a = 2, b = 2, c = 1
    Output: "aabbc"
    
    


    예 3:




    Input: a = 7, b = 1, c = 0
    Output: "aabaa"
    Explanation: It's the only correct answer in this case.
    
    


    제약:


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

  • C#으로 답변:




    public class Solution
    {
        public string LongestDiverseString(int a, int b, int c)
        {
            StringBuilder sb = new StringBuilder();
            bool isHappy = true;
            char? nextChar;
    
            while (isHappy && (a > 0 || b > 0 || c > 0))
            {
                int len = sb.Length;
    
                if (len >= 2)
                {
                    nextChar = pickNextChar(sb[len - 1], sb[len - 2], a, b, c);
                }
                else if (len == 1)
                {
                    nextChar = pickNextChar(sb[0], null, a, b, c);
                }
                else
                {
                    nextChar = pickNextChar(null, null, a, b, c);
                }
    
                if (nextChar == null)
                {
                    isHappy = false;
                }
                else
                {
                    sb.Append(nextChar);
                    switch (nextChar)
                    {
                        case 'a':
                            a--;
                            break;
                        case 'b':
                            b--;
                            break;
                        case 'c':
                            c--;
                            break;
                    }
                }
            }
    
            return sb.ToString();
        }
    
        private Char? pickNextChar(Char? last, Char? secondLast, int a, int b, int c)
        {
            if (last == null || secondLast == null || !last.Equals(secondLast))
            {
                // If we are looking for the first 2 chars of the string, or the last 2 chars are not equal,
                // then we don't need to worry about string getting unhappy and can pick any of 'a', 'b' and 'c'.
                if (a >= b && a >= c)
                {
                    return 'a';
                }
                else if (b >= a && b >= c)
                {
                    return 'b';
                }
                else
                {
                    return 'c';
                }
            }
            else
            {
                // If the last 2 chars are equal, we need to pick from the other 2 chars to avoid string getting unhappy
                switch (last)
                {
                    case 'a':
                        if (b >= c)
                        {
                            if (b > 0)
                            { return 'b'; }
                            else
                            {
                                return null;
                            }
                        }
                        else if (c > 0)
                        { return 'c'; }
                        else
                        {
                            return null;
                        }
                    case 'b':
                        if (a >= c)
                        {
                            if (a > 0)
                            { return 'a'; }
                            else
                            {
                                return null;
                            }
                        }
                        else if (c > 0)
                        { return 'c'; }
                        else
                        {
                            return null;
                        }
                    case 'c':
                        if (a >= b)
                        {
                            if (a > 0)
                            { return 'a'; }
                            else
                            {
                                return null;
                            }
                        }
                        else if (b > 0)
                        { return 'b'; }
                        else
                        {
                            return null;
                        }
                    default:
                        return null;
                }
            }
        }
    }
    
    

    좋은 웹페이지 즐겨찾기