字符串组合问题

来源:互联网 发布:淘宝一直没流量怎么办 编辑:程序博客网 时间:2024/05/09 08:11

给两个串A[1..m]和B[1..n],现在要把B插入到A中,也就是说,得到一个A[1..p]B[1..n]A[p+1..m]的形式,也可以把B放到A的最前面或最后面。问能得到的字典序最小的串。


B插入A总共有m+1中方式,每种方式对应于一个[0..m]间的数字(0表示插入在最前面,i表示插入在A[i]之后)。定义F(i,j) 为A[i..m]与B[j..n]的组合中字典序最小的串对应的那个数字(值域[0..m-i+1])。求F(1,1)∈[0..m]的值。


以A[1..3]和B[1..4]为例,共有如下4中组合:


0 : b1 b2 b3 b4 a1 a2 a3

1 : a1 b1 b2 b3 b4 a2 a3

2 : a1 a2 b1 b2 b3 b4 a3

3 : a1 a2 a3 b1 b2 b3 b4


- 如果b1<a1则结果为F(1,1)=0;

- 如果b1>a1则可以递归为求解1,2,3中的最小串,等价于A[2..3]和B[1..4]的最小串的序号加1,即F(1,1)=F(2,1)+1;

- 如果b1==a1则可以将上图中b1替换成a1得到下图,可见结果等价于A[1..3]和B[2..4]的组合,即F(1,1)=F(1,2);


0 : a1 b2 b3 b4 a1 a2 a3

1 : a1 a1 b2 b3 b4 a2 a3

2 : a1 a2 a1 b2 b3 b4 a3

3 : a1 a2 a3 a1 b2 b3 b4


综上所述,得到一个递归解决该问题的方法:

F(i,j) =  0                      if   i>m || j>n || a[i]<b[j]

             F(i+1, j) + 1    if   a[i] > b[j]

             F(i, j+1)           if   a[i] == b[j]

原创粉丝点击