POJ 2192

题目的意思是给出三个字符串,问你前面两个字符串能不能合并成第三个字符串。注意一个字符串里的字母的顺序是不能颠倒的。

刚看到这道题目觉得很简单,可是开始写了发现要用动归。想了好久都没有思路。去网上看了一下解题报告,看到简单的一句话就有了思路:


f[i][j] 表示第一串字符串的前i个和第二串字符串的前j个是否能组成第三个字符串的前i + j个。


然后就要注意初始化的问题,这个地方纠结了很久。下面是代码:

#include<iostream>
#include<string>
using namespace std;

string s1, s2, s3;
int T;

int main()
{
	while(cin >> T){
	for(int k = 1; k <= T; ++k)
	{
		cin >> s1 >> s2 >> s3;
		bool f[300][300] = {0};
		if(s1[0] == s3[0])
			f[1][0] = 1;
		if(s2[0] == s3[0])
			f[0][1] = 1;
		for(int i = 0; i <= s1.size(); ++i)
		{
			for(int j = 0; j <=  s2.size(); ++j)
			{
				if(i && s1[i - 1] == s3[i + j - 1])
					f[i][j] = (f[i][j] || f[i - 1][j]);
				if(j && s2[j - 1] == s3[i + j - 1])
					f[i][j] = (f[i][j] || f[i][j - 1]);
			}
		}
		cout << "Data set " << k << ": ";
		if(f[s1.size()][s2.size()])
			cout << "yes" << endl;
		else
			cout << "no" << endl;
	}
	}
	return 0;
}

初始化之前的两个判断首字母是否都能和第三个字符串的首字母匹配。

后面特别需要注意:

两个循环都需要从0开始,(至少J是必须要从零开始)。我已开始是从1开始的结果第二组数据通不过,一步一步地调试才发现需要j从0开始。因为如果碰到一种情况就是刚好第三个字符串是两个字符串连起来的那么就需要用到前i个是第一串,0个是第二串的时候为1.

最后要注意就是更新是否可行的时候,要或上现在的状况。因为或许现在本身就是1,不要把它变成了0. 总之这道题本身不难,但是有一些细节需要注意。


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值