【问题标题】:C programming Problem - Maximum PartitionsC 编程问题 - 最大分区
【发布时间】:2021-04-06 18:13:13
【问题描述】:

我正在努力解决并在 C 中实现一个作为输入的函数 一个“字符串”,它包含字符“a”或“b”(输入字符串可能完全包含字符“a”和“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 个部分,则丢弃这种可能性!),在这种情况下,最大可能性是:(小心这里'a'是o没有出现所以在每个排列/集合中没有'a'并且每个集合都相等-没有'a'-) (bb,b,bb) , (bbb,b,b) , (bb,bb,b) ,(b,bbb,b),(b,bb,bb),(b,b,bbb)。

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

我正在努力用 C 语言实现这个功能,我坚持了大约三天。 我开始考虑用递归方法解决这个问题,因为我们正在讨论排列和最大可能性。 所以我深思熟虑并开始使用我的算法: 第一个条件是检查: 'a' % 3 == 0 对于一个 permutation/set 的每 3 个部分。 (套装包括 3 个部分) 然后思考另一个条件的递归规则是什么(字符串的长度> 3)。 但我卡住了,我无法完成我不知道如何继续,请帮忙?最难的是发现我的问题的递归规则及其边缘条件。

有什么帮助吗?!

非常感谢。

【问题讨论】:

  • 这些东西不叫排列,而是叫分区。 “排列”这个词是为别的东西保留的。
  • 你想只输出可能性的数量,还是打印不同的分区?
  • @Damien 打印所有不同的可能集合分区。 (每个可能性都有一组3个分区,尽可能被分区)
  • @n.'pronouns'm。抱歉,错过了..所以是分区。

标签: c algorithm permutation software-design


【解决方案1】:

具有固定数量的零件和已知数量的 K"a" 在您需要的每个零件中:

找到K-th "a" p1的位置
找到K+1-st "a" p2的位置
找到2K-th "a" p3的位置
找到2K+1-st "a" p4的位置

然后做两个for循环——一个(i index)从p1位置到p2-1,第二个(j index)从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

【讨论】:

  • 感谢您的回复,但不是很了解您。您可以通过示例甚至您想要的任何语言(python / matlab / java ..随便)的代码来解释它以很好地理解您..对我来说您编写哪种语言并不重要,因为我想理解这个概念.提前致谢
  • 一个用于演示概念/想法的伪代码也有助于我很好地理解。如果我采用递归方法,那么递归规则的部分对我来说确实是最难理解/实现它的部分。
  • @Ryan OK,看看 Python 实现
  • 非常感谢,但我仍然混淆了您算法的概念。为什么我需要 K+1 和 2k , 2k+1 个职位?不明白为什么我需要找到 K 和 K+1 、 2k 、 2k+1 位置?为什么不是 k , k+1 , 3k , 3k+1 ....你能用文字解释一下算法吗(确切地说是找到第 K 个位置和第 2k 个位置的部分)
  • 整个字符串包含3K个“a”,所以第一部分应该包含K个“a”,第二部分应该是K个“a”,编号从K+1到2K,第三部分应包含从 2K+1 到 3K 编号的 K 个“a”。清楚了吗?
【解决方案2】:

要获得三个部分,您必须进行 2 次拆分。人们可以预先确定这些拆分必须出现在哪些“a”之间。每个拆分都必须在“b”的(可能是空的)序列中完成。如果在分割位置有 n 个“b”,则有 n+1 个可能的切割。只需将第一次拆分的所有可能性与第二次拆分的所有可能性结合起来即可。

【讨论】:

  • 是的,我需要将其拆分两次(除以 2)。但我坚持递归规则,这对我来说是最难的部分,三天就坚持了! ,您可以通过任何伪代码或其他什么来解释更多吗?将不胜感激。
  • 不需要递归。只需使用两个嵌套的 for 循环。一个用于第一个拆分位置,另一个用于第二个拆分位置。
  • 是的,显然我的递归方法使问题更加复杂,所以不会采用这种方法。根据你的说法,所以假设我有长度为 5 的字符串,所以有两个 for 循环,它们迭代到长度为 5?老实说,我不明白两个循环是如何解决问题的。你能用伪代码详细说明一下吗?只是为了理解你的意思。
猜你喜欢
  • 1970-01-01
  • 2021-09-15
  • 1970-01-01
  • 2019-05-21
  • 1970-01-01
  • 2020-07-27
  • 1970-01-01
  • 2019-12-07
  • 1970-01-01
相关资源
最近更新 更多