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