Как вернуть максимально длинную разнородную строку, содержащую не более A, B и C букв - PullRequest
2 голосов
/ 02 ноября 2019

Итак, я новичок в python и пробую несколько разных задач кодирования. Для этого задания требуется следующее:

Мы рассматриваем алфавит только с тремя буквами: «a», «b» и «C». Строка называется разной, если никакие три последовательных буквы не совпадают. Другими словами, разнородная строка не может содержать строки «aaa», «bbb» или «ccc».

Написать функцию: class Solution {public String solution (int A, int B, int C);} что, учитывая три целых числа A, B и C, возвращает любую максимально длинную разнородную строку, содержащую не более A букв «a», не более B букв «b» и не более C букв «c». Если нет возможности построить какую-либо строку, верните пустую строку. Примеры: 1. Если A = 6, B = 1 и C = 1, ваша функция может возвращать «aabaacaa». Обратите внимание, что "aacaabaa" также будет правильным ответом. Ваша функция может вернуть любой правильный ответ. 2. Учитывая A = 1, B = 3 и C = 1, ваша функция может возвращать «abbcb», «bcbab», «bacbb» или любую из нескольких других строк. 3. Учитывая A = 0, B = 1 и C = 8, ваша функция должна возвращать «ccbcc», который является единственным правильным ответом в этом случае,

Предположим, что: A, B и C являются целыми числами в пределахдиапазон [0..100);A + B + C> 0.

Я попытался создать несколько операторов if и код скомпилировался, однако в примере теста (6, 1, 1) выдается ошибка, любая помощь или исправленный код будут с благодарностью приняты. Как решить эту проблему.

def solution(A, B, C):
rt = ""
while (0<A or 0<B or 0<C) :
    #more b append "bba"
    if (A<B):
        if (0<B):
            rt = rt+'b'
            B -= 1
        if (0<B):
            rt+='b'
            B -= 1
        if (0<A):
            rt+='a'
            A -= 1


    #more a appand aab
    elif (B < A): 
        if (0 < A): 
            rt += 'a'
            A -= 1
        if (0 < A): 
            rt += 'a'
            A -= 1
        if (0 < B): 
            rt += 'b'
            B -= 1

    #more c append ccb
    elif (B < C): 
        if (0 < C): 
            rt += 'c'
            A -= 1
        if (0 < C): 
            rt += 'c'
            A -= 1
        if (0 < B): 
            rt += 'b'
            B -= 1


    #more a appenc aac
    elif (C < A):
         if (0 < A): 
            rt += 'a'
            A -= 1
        if (0 < A): 
            rt += 'a'
            A -= 1
        if (0 < C): 
            rt += 'c'
            C -= 1

    #more c append cca
    elif (A<C):
        if (0<C):
            rt = rt+'c'
            B -= 1
        if (0<C):
            rt+='c'
            B -= 1
        if (0<A):
            rt+='a'
            A -= 1


    #more b append bbc
    elif (C<B):
        if (0<B):
            rt = rt+'b'
            B -= 1
        if (0<B):
            rt+='b'
            B -= 1
        if (0<A):
            rt+='c'
            C -= 1

    # Equal number of a, b and c
    # append "abc" 
    else : 
        if (0 < A): 
            rt += 'a'
            A -= 1
        if (0 < B): 
            rt += 'b'
            B -= 1
        if (0 < C):
            rt += 'c'
            C -= 1

            print(rt) 


pass

Ожидается вывод, что буква не встречается 3 раза подряд. Примеры: a = 1 b = 2 c = 4 должен возвращать вывод примерно так: cacbbcc или accbcbc и т. Д.

не что-то вроде этого: acbcccb обратите внимание, что c происходит 3 раза подряд

1 Ответ

1 голос
/ 04 ноября 2019

Этот код должен работать. Пожалуйста, попробуйте.

from itertools import permutations
import math
import re

a = int(input())
b = int(input())
c = int(input())
num = math.ceil((a + b + c) / 2)
str_val = a*'a'+b*'b'+c*'c'
str_per = list(set(list(permutations(str_val))))
temp_str, output_str = [], []
val = ["".join(i) for i in str_per]
for each in val:
    all_find_str = re.findall(r"([a-z])\1{2,}", each)
    if not all_find_str:
        output_str.append(each)
    else:
        all_find_str = re.findall(r"([a-z])\1{2,}", each[:num])
        if not all_find_str:
            temp_str.append(each[:num])
if output_str:
    print("Output is:", set(output_str))
else:
    print("Output is:", set(temp_str))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...