(个人水平有限,请见谅!)
描述:
给出三个队列 s1,s2,s3 ,判断 s3 是否是由 s1 和 s2 交叉得来。 如:s1 为 aabcc , s2 为 dbbca。 当 s3 为 aadbbcbcac 时,返回 true(即将 s1 拆成三部分: aa,bc,c 分别插入 s2 对应位置) 否则返回 false。
输入:
aabcc,dbbca,aadbbcbcac。
输出:
true。
输入样例:
aabcc,dbbca,aadbbcbcac
aabcc,dbbca,aadbbbaccc
a,b,ab
a,b,ba
a,b,ac
abc,bca,bcaabc
abc,bca,aabbcc
输出样例:
true
false
true
true
false
true
false
代码示例:
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
bool exchange(string s1, string s2, string str)
{
if (s1.size() + s2.size() != str.size())
return false;
if (s1 == "" || s2 == "")
{
if (s1 == str || s2 == str)
return true;
else
return false;
}
if ((str[str.size() - 1] != s1[s1.size() - 1]) && (str[str.size() - 1] != s2[s2.size() - 1]))
return false;
if ((str[str.size() - 1] != s1[s1.size() - 1]) && (str[str.size() - 1] == s2[s2.size() - 1]))
return exchange(s1, s2.erase(s2.size()-1,1), str.erase(str.size()-1,1));
if ((str[str.size() - 1] == s1[s1.size() - 1]) && (str[str.size() - 1] != s2[s2.size() - 1]))
return exchange(s1.erase(s1.size() - 1, 1), s2, str.erase(str.size() - 1, 1));
if ((str[str.size() - 1] == s1[s1.size() - 1]) && (str[str.size() - 1] == s2[s2.size() - 1]))
return exchange(s1, s2.erase(s2.size() - 1, 1), str.erase(str.size() - 1, 1)) || exchange(s1.erase(s1.size() - 1, 1), s2, str.erase(str.size() - 1, 1));
return false;
}
int main()
{
char line[1000001];
while (cin.getline(line, 1000000)) {
char cs1[1000], cs2[1000], cs3[1000];
string s1, s2, s3;
sscanf(line, "%[^,],%[^,],%[^,]", cs1, cs2, cs3);
s1 = cs1;
s2 = cs2;
s3 = cs3;
bool result = exchange(s1, s2, s3);
cout << (result == true ? "true" : "false") << endl;
}
return 0;
}