[每日一题]123:交叉队列(小米OJ - 6,递归)

142 阅读1分钟

文章目录


题目描述

给出三个队列 s1,s2,s3 ,判断 s3 是否是由 s1 和 s2 交叉得来。 如:s1 为 aabcc , s2 为 dbbca。 当 s3 为 aadbbcbcac 时,返回 true(即将 s1 拆成三部分: aa,bc,c 分别插入 s2 对应位置) 否则返回 false。

输入:

aabcc,dbbca,aadbbcbcac

输出:

true

题解思路

  1. 先分割输入字符串
  2. 再递归判断,尤其是对两个字符串的字母都与当前字符串的字母相同时

代码实现:

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;
}