【发布时间】:2019-09-29 17:16:39
【问题描述】:
几天来我一直在绞尽脑汁想出一个级数或封闭式方程来解决以下问题:
具体来说:给定所有长度为 N 的字符串,这些字符串取自 L 个字母的字母表(以 'A' 开头,例如 {A, B}, {A , B, C}, ...),这些字符串中有多少包含与模式匹配的子字符串:'A',超过 1 个 not-'A','A'。该模式的标准正则表达式是A[^A][^A]+A。
可能的字符串数量很简单:L^N。对于 N 和 L 的小值,简单地创建所有可能的组合并使用正则表达式查找与模式匹配的子字符串也非常实用;在 R 中:
all.combinations <- function(N, L) {
apply(
expand.grid(rep(list(LETTERS[1:L]), N)),
1,
paste,
collapse = ''
)
}
matching.pattern <- function(N, L, pattern = 'A[^A][^A]+A') {
sum(grepl(pattern, all.combinations(N, L)))
}
all.combinations(4, 2)
matching.pattern(4, 2)
我想出了以下方法,适用于 N
M <- function(N, L) {
sum(
sapply(
2:(N-2),
function(g) {
(N - g - 1) * (L - 1) ** g * L ** (N - g - 2)
}
)
)
}
不幸的是,这仅在 N
有什么建议吗?我也对程序解决方案持开放态度,只要它们不会因组合数量而爆炸(就像我上面的代码一样)。我希望能够计算 N 从 15 到 25 和 L 从 2 到 10 的值。
对于它的价值,这里是组合的数量,以及 N 和 L 的一些值的匹配组合,可以通过生成所有组合并进行正则表达式匹配来确定:
N L combinations matching
-- - ------------ --------
4 2 16 1
5 2 32 5
6 2 64 17
7 2 128 48
8 2 256 122
9 2 512 290
10 2 1024 659
4 3 81 4
5 3 243 32
6 3 729 172
7 3 2187 760
8 3 6561 2996
9 3 19683 10960
10 3 59049 38076
4 4 256 9
5 4 1024 99
6 4 4096 729
7 4 16384 4410
8 4 65536 23778
9 4 262144 118854
10 4 1048576 563499
【问题讨论】:
-
我猜你会对 math.stackexchange 更感兴趣
-
AAAAA不应计算在内,因为它与模式不匹配(字母 A,后跟两个或多个非 A 字母,然后是另一个字母 A)。对于 N = 5 和 L = 2,匹配模式为ABBAA, AABBA, BABBA, ABBBA, ABBAB。如果您熟悉正则表达式语法,则该模式将表示为A[^A][^A]+A。
标签: r regex probability combinatorics longest-substring