【问题标题】:How can I count the number of ways to divide a string into N parts of any size?如何计算将字符串分成任意大小的 N 部分的方法数量?
【发布时间】:2021-04-22 16:17:11
【问题描述】:

我正在尝试计算在 Python 中可以将给定字符串分成三部分的方法数。

例子:"bbbbb"可以分为三部分6种方式:

  1. b|b|bbb
  2. b|bb|bb
  3. b|bbb|b
  4. bb|b|bb
  5. bb|bb|b
  6. bbb|b|b

我的第一条思路是N choose K,其中N = 字符串的长度,K = 拆分方式的数量 (3),但这仅适用于 3 和 4。

我的下一个想法是遍历字符串并计算前三分之一可以分割的点数和第二个三分之一可以分割的点数,然后将这两个计数相乘,但我无法实现,我什至不确定它是否会起作用。

如何计算将字符串拆分为N 部分的方法?

【问题讨论】:

  • 空字符串也是子字符串,是否允许任何“部分”为空字符串? (这个问题是一个实际的问题,例如,考虑'a '.split(' ') 返回什么)。
  • 答案是import math; math.comb(N - 1, K - 1),使用Python标准库中的函数math.comb,其中N是字符串的长度,K是个数。每一段都必须是一个非空字符串。

标签: python string combinations


【解决方案1】:

将拆分的位置视为您选择的元素:

b ^ b ^ b ^ ... ^ b

^是可以拆分的地方,还有N - 1可以拆分的地方(N是字符串的长度),如果你想把字符串拆分成M部分,你需要选择M - 1分割的地方,所以它是N - 1 choose M - 1

例如,N = 5M = 3(N - 1 choose M - 1) = (4 choose 2) = 6.

一个实现:

import scipy.special

s = 'bbbbb'
n = len(s)
m = 3
res = scipy.special.comb(n - 1, m - 1, exact=True)

print(res)

输出:

6

【讨论】:

  • 我不知道他为什么在python标签上发布这个问题? :) 这是一个统计问题。我认为 thejoj 的目标是别的......
  • 啊,有道理。谢谢你。这两者兼而有之,是 Python 中的统计问题。我已经写了一个选择和阶乘函数,只是没有意识到 -1 部分。现在可以了,再次感谢。
【解决方案2】:

希望这对你也有帮助:

string = "ABCDE"
div = "|"
out = []
for i in range(len(string)):
    temp1 = ''
    if 1 < i < len(string):
        temp1 += string[0:i-1] + div
        for j in range(len(string) + 1):
            temp2 = ""
            if j > i:
                temp2 += string[i-1:j-1] + div + string[j-1:]
                out.append(temp1 + temp2)
print(out)

结果:

['A|B|CDE', 'A|BC|DE', 'A|BCD|E', 'AB|C|DE', 'AB|CD|E', 'ABC|D|E']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    相关资源
    最近更新 更多