题目:
Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrings recursively.
Below is one possible representation of s1 = "great"
:
great
/ \
gr eat
/ \ / \
g r e at
/ \
a t
To scramble the string, we may choose any non-leaf node and swap its two children.
For example, if we choose the node "gr"
and swap its two children, it produces a scrambled string "rgeat"
.
rgeat
/ \
rg eat
/ \ / \
r g e at
/ \
a t
We say that "rgeat"
is a scrambled string of "great"
.
Similarly, if we continue to swap the children of nodes "eat"
and "at"
, it produces a scrambled string "rgtae"
.
rgtae
/ \
rg tae
/ \ / \
r g ta e
/ \
t a
We say that "rgtae"
is a scrambled string of "great"
.
Given two strings s1 and s2 of the same length, determine if s2 is a scrambled string of s1.
Example 1:
Input: s1 = "great", s2 = "rgeat"
Output: true
Example 2:
Input: s1 = "abcde", s2 = "caebd"
Output: false
描述:
一个字符串每次最多切成两部分,每一部分可以以相同的规则再次切分,最终形成一棵二叉树,其中任何左右子树均可以交换,最终形成新的字符串是为原字符串的爬行字符串。
现给出两个字符串,问两个串是否相互为爬行字符串。
分析:
暴力破解,尝试所有的切分位置,尽可能优化,
这个解法里最有技巧的是借助一个数组来统计两个串中的字符是否一样,具体见代码。
(这道题参见了大神的做法,原本以为有什么很好的方法,结果还是暴力搜索)
代码:(时间复杂度O(n!),空间复杂度O(n))
class Solution {
public:
bool isScramble(string s1, string s2) {
if (s1 == s2) {
return true;
}
if (s1.size() != s2.size()) {
return false;
}
int count[256] = {0};
int len = s1.size();
for (int i = 0; i < len; ++ i) {
++ count[s1[i]];
-- count[s2[i]];
}
for (int i = 0; i < 256; ++ i) {
if (count[i] != 0) {
return false;
}
}
for (int i = 1; i < len; ++ i) {
bool succeed = isScramble(s1.substr(0, i), s2.substr(0, i)) && isScramble(s1.substr(i), s2.substr(i));
if (succeed) {
return true;
}
succeed = isScramble(s1.substr(0, i), s2.substr(s2.size() - i)) && isScramble(s1.substr(i), s2.substr(0, s2.size() - i));
if (succeed) {
return true;
}
}
return false;
}
};