把一个字符串变成一颗二叉树,如果一个新字符串能由任意交换子树得到,则称为Scramble String。苦思冥想,自知不善于分治,故特别记录下来。
如果两个字符串是Scramble String,则必然有它们的两个子串分别互为Scramble String,如此二分下去直到字串长度为1,就只需判断是否相等。能有这种分而治之的思想此题就非常简单了。
for (int i = 1; i < n; ++i) {
if ((isScramble(s1.substr(0, i), s2.substr(0, i)) && isScramble(s1.substr(i), s2.substr(i))) || (isScramble(s1.substr(0, i), s2.substr(n - i)) && isScramble(s1.substr(i), s2.substr(0, n - i)))) {
return true;
}
}
以上核心代码非常简单易懂,只需要穷举所有的字串。但是这样简单穷举会遇到超时的问题,还要借助一些辅助判断先排除掉某些根本不可能的情况,减少递归穷举的次数。比如,如果两个字符串长度不相等就必定不是 Scramble String,字母种类和数量不相等也不是Scramble String。以下是完整C++代码。
class Solution {
public:
bool isScramble(string s1, string s2) {
if (s1 == s2) return true;
if (s1.size() != s2.size