1) 将测试/目标字符串转换为数组,其中每个元素是一对描述连接的“A”和“B”的数量。
例如 ABBABB ==> { (1,2) (1,2) }; BBB ==> { (0,3) }; 巴巴 ==> { (0,1) (1,1) (1,0) }
2)定义元素级别包含:如果a>=c且b>=d,则P1(a,b)包含P2(c,d)
在两个元素 P1 (a,b) 和 P2 (c,d) 上定义两个操作
合并A(P1,P2) ==> (a+c,d);
合并B(P1,P2) ==> (a,b+d)
3)现在我们有一个抽象的问题:给定测试数组{T1,T2,...,Tn}和目标数组{A1,A2,...Am},指示目标数组是否包含测试数组。这里“包含”可以递归定义。
如果 i,目标数组包含测试数组。目标数组具有与测试数组相同或更多的元素;ii. 对于 [1,m] 中的每个 i,Ai 都包含 Ti
或者
mergeA(A1,A2), A3, A4 ... 包含测试数组
或者
mergeB(A1,A2), A3, A4 ... 包含测试数组
4) 伪代码
bool ifContain(Pair[] target, Pair[] test) {
if (test.length>target.length) return false;
if (test.length()==1)
return (target.A>=test.A && target.B>=test.B);
return (ifContain(target[0], test[0]) && ifContain(targe(1,:),test(1,:)))
|| ifContain(Pair(target[0].a,target[0].b+target[1].b)+target(2,:),test)
|| ifContain(Pair(target[0].a+target[1].a+target[1].b)+target(2,:),test);
}