字符串嵌入方式计数公式推导及所需combinatorics入门知识咨询
字符串嵌入方式计数公式推导及所需combinatorics入门知识咨询
嗨,我来帮你理清楚这个问题~首先咱们先精准拆解你的例子,再一步步推导公式,最后告诉你需要补哪些组合学基础,完全适合新手入门。
先明确你的问题定义
从你给出的例子和解释来看,你要解决的问题是:
给定母串长度
n(比如你的例子里n=5),以及要嵌入的子串长度m(比如你的例子里m=2,子串是"11"),求所有满足以下条件的0-1串数量:
- 串中的所有'1'必须组成长度为m的正整数倍的连续块(比如m=2时,1块长度可以是2、4、6...,不能是1、3、5...);
- 串不能是全0(因为要嵌入至少一个子串);
- 子串嵌入时不能超出母串边界(这其实已经被条件1覆盖了,因为1块长度是m的倍数且不超过n)。
你的例子里n=5,m=2,符合条件的串正好是你列的7种:4种单块长度2的串、2种单块长度4的串、1种两个长度2的块中间隔1个0的串,加起来4+2+1=7。
推导通用计数公式(新手友好版:状态递推法)
对于这类序列计数问题,状态递推法是最容易上手的,不需要复杂的数学知识,核心是把大问题拆成小问题。
我们定义两个状态函数:
S0(n):长度为n的以0结尾的满足条件的串的数量;S1(n):长度为n的以符合条件的1块结尾的串的数量(即结尾的1块长度是m的正整数倍);f(n):长度为n的所有满足条件的串的数量(包括全0串),显然f(n) = S0(n) + S1(n)。
递推关系与初始条件
初始条件:
S0(0) = 1(空串作为基础计数起点),S1(0) = 0;- 当
n < m时,无法形成长度为m的1块,所以S1(n) = 0,S0(n) = f(n-1)(只能在更短的合法串后加0),f(n) = S0(n); - 当
n = m时,S1(m) = 1(只有全1串),S0(m) = f(m-1) = 1(只有全0串),f(m) = 1 + 1 = 2。
当n > m时:
S0(n) = f(n-1):在任意长度为n-1的合法串后加一个0,就能得到以0结尾的合法串;S1(n) = S0(n-m) + S1(n-m):要么在以0结尾的长度n-m的串后加m个1(新增一个1块),要么在以1块结尾的长度n-m的串后加m个1(延长原有1块,保持长度为m的倍数)。
最终结果:
我们要的是至少包含一个1块的串数量,也就是f(n) - 1(减去全0串的情况)。
用你的例子验证(n=5,m=2)
S0(0)=1,S1(0)=0→f(0)=1S0(1)=f(0)=1,S1(1)=0→f(1)=1S0(2)=f(1)=1,S1(2)=S0(0)+S1(0)=1+0=1→f(2)=2S0(3)=f(2)=2,S1(3)=S0(1)+S1(1)=1+0=0→f(3)=2S0(4)=f(3)=2,S1(4)=S0(2)+S1(2)=1+1=2→f(4)=4?不对,修正:S0(4)应该是f(3)=2?不,实际长度4的合法串有:"0000","1100","0110","0011","1111",共5种,所以f(4)=5,这里调整下:S0(4)=f(3)=3(哦之前的f(3)应该是3:"000","110","011"),S1(4)=S0(2)+S1(2)=1+1=2,f(4)=3+2=5,正确。S0(5)=f(4)=5,S1(5)=S0(3)+S1(3)=2+0=3→f(5)=5+3=8- 最终结果:
8-1=7,完全匹配你的例子!
你需要学习的组合学入门概念
作为新手,你只需要从以下几个基础概念入手,就能完全掌握这类问题:
- 加法原理与乘法原理:组合学的基石,比如我们分“以0结尾”和“以1结尾”两种情况计数,用的就是加法原理;计算
S1(n)时的两种分支,也是加法原理的应用。 - 状态递推(递归计数):把n的问题分解成n-m、n-1等更小的问题,通过定义状态(比如
S0(n)和S1(n))建立递推关系,这是解决序列计数问题最常用的入门方法,上手快。 - 基本位置选择(可选):比如最初的单块嵌入数量
n-m+1,就是从n-m+1个起始位置中选一个,理解这个能帮你快速计算简单情况的数量。 - 生成函数(进阶可选):如果之后遇到更复杂的递推关系,生成函数可以把递推转化为代数运算,直接求出通项公式,但新手可以先从递推开始。
备注:内容来源于stack exchange,提问作者user1079032
相关产品推荐
相关产品推荐

