文章目录
题目描述
给出三个队列 s1,s2,s3 ,判断 s3 是否是由 s1 和 s2 交叉得来。 如:s1 为 aabcc , s2 为 dbbca。 当 s3 为 aadbbcbcac 时,返回 true(即将 s1 拆成三部分: aa,bc,c 分别插入 s2 对应位置) 否则返回 false。
输入:
aabcc,dbbca,aadbbcbcac
输出:
true
题解思路
- 先分割输入字符串
- 再递归判断,尤其是对两个字符串的字母都与当前字符串的字母相同时
代码实现:
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;
}
else 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));
}
else 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));
}
else 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()
{
string s;
while (cin >> s) {
string s1, s2;
while (s.size()) {
int n = s.find(',');
if (n == -1) {
break;
}
if (s1.size() == 0) {
s1 = s.substr(0, n);
}
else {
s2 = s.substr(0, n);
}
s = s.substr(n + 1);
}
if (exchange(s1, s2, s))
{
cout << "true" << endl;
}
else {
cout << "false" << endl;
}
}
return 0;
}