字符串组合问题

给两个串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]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值