将题目可以转换成寻找一条路径。走过s1或s2时,不能跳过或回头,只能沿着当前字符串前进或者跳到另一个字符串上一次走到的位置。
利用dp[i][j]记录路径,i表示走到s1的当前位置,j表示走到s2的当前位置,dp[i][j]表示当前路径是否等于与s3截止到 i+j 的相等。
#include <bits/stdc++.h>
using namespace std;
void ipize()
{
ios::sync_with_stdio(0);
cin.tie(0);
}
string s1, s2, s3;
string temp;
stringstream ss;
int dp[1001][1001];
int main()
{
ipize();
while (cin >> temp)
{
// input.
ss.clear();
for (int i = 0; i < temp.size(); i++)
if (temp[i] == ',')
temp[i] = ' ';
ss << temp;
ss >> s1 >> s2 >> s3;
memset(dp, 0, sizeof(dp));
dp[0][0] = true;
int len1 = s1.length();
int len2 = s2.length();
// cal.
for (int i = 1; i <= len1; i++)
dp[i][0] = dp[i - 1][0] && (s3[i - 1] == s1[i - 1]);
for (int i = 1; i <= len2; i++)
dp[0][i] = dp[0][i - 1] && (s3[i - 1] == s2[i - 1]);
for (int i = 1; i <= len1; i++)
for (int j = 1; j <= len2; j++)
{
int x = i + j;
if (s3[x - 1] == s1[i - 1])
dp[i][j] = dp[i][j] || dp[i - 1][j];
if (s3[x - 1] == s2[j - 1])
dp[i][j] = dp[i][j] || dp[i][j - 1];
}
cout << (dp[len1][len2] ? "true" : "false") << endl;
}
return 0;
}