题目意思是给定三个字符串,判断第三个字符串是否为前两个字符串按顺序随机生成。听了动态规划的方法觉得真的神乎其技,核心在于不必关心中间各种细节和函数的调用,只需处理好现态与次态之间的转换关系和最终的出口即可。在本题中,从三个字符串的最后一个字符串开始进行调用,如果等于其中一个的最后一个,就将其删掉,继续判断剩下的字符串,即生成了子问题;同样不必关心细节,只需要知道当最后结果是 true 时,三个字符串都会被删光,所以三个游标值均为负数即可。
#include <stdio.h>
#include <iostream>
#include <vector>
#include <string>
#include <memory.h>
using namespace std;
string a, b, all; // 三个字符串
bool deal(int ia, int ib, int iall)
{
if (iall<0 && ia<0 && ib<0) // 当三个游标为负数时,返回真
return true;
if (ia>=0 && all[iall]==a[ia]) // 与第一个字符串的最后一位相同
{
if (all[iall]==b[ib]) // 与两个串的最后一位相同
return deal(ia-1, ib, iall-1) ||
deal(ia, ib-1, iall-1); // 这里很巧妙,就是分两步
return deal(ia-1, ib, iall-1);
}
if (ib>=0 && all[iall]==b[ib])
return deal(ia, ib-1, iall-1);
return false; // 都不相同就可以直接 false 了
}
int main()
{
int t,i=1;
cin >> t;
while (t--)
{
cin >> a >> b >> all;
printf("Data set %d: %s\n", i++,
deal(a.length()-1, b.length()-1, all.length()-1)?"yes":"no");
}
//system("pause");
return 0;
}