C编程问题-最大分区



我很难在C中解决和实现一个作为输入的函数a";字符串";它包含的字符是"a"或"b"(输入字符串可能包括字符"a"one_answers"b"(,函数的作用是在每个排列/集合将字符串划分为三部分,而在每个排列或集合不具有NULL/空字符。排列/集合不一定相等,但它们都(每个集合/排列的三个部分(相同字符"a"的出现次数。函数必须返回我们可以在每个可能的集合/排列中将字符串除以3的最大可能性。

示例:#1输入字符串:";ababa";具有排列/集合的4种可能性(正如我所说,每个排列都包含3个部分,如果没有3个部分则放弃这种可能性!(,在这种情况下,最大可能性为:(ab,a,ba(,(a,bab,a(,(a,ba,ba(,(ab,ab,a(。

#2输入字符串:";bbbbb";有6种排列/集合的可能性(正如我所说,每个排列都包含来自3个部分的,如果没有3个部分,则放弃这种可能性!(,在这种情况下,最大可能性是:(bb,b,bb(,(bbb,b,b(,(bb,bb,b。

#3输入字符串:'ababb'有0种可能性,因此函数返回空字符串或NULL或""甚至可以返回我们想要的任何东西,类似于这个字符串没有任何可能性。

我很难在C中实现这个功能,我坚持了大约三天。我开始考虑用递归方法来解决这个问题,因为我们谈论的是排列和最大可能性。所以我深入思考并开始使用我的算法,如下所示:第一个条件是检查:对于一个排列/集合的每3个部分,"a"%3==0。(套装由3部分组成(然后思考其他条件(字符串长度>3(的递归规则是什么。但我被卡住了,无法完成。我不知道如何继续,有什么帮助吗?最困难的事情是发现我的问题的递归规则及其边缘条件。

有人帮忙吗?!

非常感谢。

零件数量固定,每个零件中"a"K数量已知,您只需要:

找到第CCD_ 3"的位置;a";CCD_ 4
查找CCD_;a";CCD_ 6
找到第CCD_;a";CCD_ 8
查找CCD_;a";p4

然后做两个for循环——一个(i索引(从p1位置到p2-1,第二个(j索引(从p3位置到p4-1,并输出受[0..i], [i+1..j], [j+1..strlen-1]索引限制的字符串部分。

Python中的示例:

def makeparts(s):
acnt = s.count('a')
if acnt % 3:
return #no solutions
ca = 0
ka = acnt // 3
for i in range(len(s)):
if s[i] == 'a':
ca += 1
if ca == ka:
ip1 = i
elif ca == ka + 1:
ip2 = i
if ca == 2 * ka:  #note separate "if"
ip3 = i
elif ca == 2 * ka + 1:
ip4 = i
for left in range(ip1, ip2):
for right in range(ip3, ip4):
print(s[:left + 1], s[left+1:right+1], s[right+1:])
makeparts('abbabbba')
makeparts('abbababbbababa')
a bba bbba
a bbab bba
a bbabb ba
a bbabbb a
ab ba bbba
ab bab bba
ab babb ba
ab babbb a
abb a bbba
abb ab bba
abb abb ba
abb abbb a
abba babbba baba
abba babbbab aba
abbab abbba baba
abbab abbbab aba

要得到三个部分,必须进行两次拆分。人们可以预先确定在哪种情况之间出现";a";这些分割必须是;b";s.如果是n〃;b";s,则存在n+1个可能的切割。只需将第一次拆分的所有可能性与第二次拆分的全部可能性结合起来。

最新更新