题目描述
题目给出一个字符串s1,我们可以用递归的方法将字符串分成两个非空的子串来将s1表示成一个二叉树,下面是s1=“great”的一种二叉树的表现形式:
great
/
gr eat
/ \ /
g r e at
/
a t
将字符串乱序的方法是:选择任意的非叶子节点,交换它的两个孩子节点。
例如:如果我们选择节点“gr”交换他的两个孩子节点,就会产生一个乱序字符串"rgeat".
rgeat
/
rg eat
/ \ /
r g e at
/
a t
我们称"rgeat"是"great"的一个乱序字符串。
类似的:如果我们继续交换“eat”的两个孩子节点和“at”的两个孩子节点,会产生乱序字符串"rgtae".
rgtae
/
rg tae
/ \ /
r g ta e
/
t a
我们称"rgtae"是"great"的一个乱序字符串。 给出两个长度相同的字符串s1 和 s2,请判断s2是否是s1的乱序字符串。
示例1
输入 “ab”,“ab”
输出 true
示例2
输入 “ba”,“ab”
输出 true
class Solution {
public:
/**
*
* @param s1 string字符串
* @param s2 string字符串
* @return bool布尔型
/*
* 思路:从简单情况开始,
* 1.两个字符串都只有一个字符时只需比较是否相等
* 2.字符个数大于一时,先判断长度是否相等,在判断是否由相同的字符组成,若否则直接返回false
* 3.分隔字符串,有两种情况,一种是不交换,一种是左右交换
*/
bool isScramble(string s1, string s2) {
// write code here
if(s1==s2)//两个空串也是相等的
return true;
int ch[26]={0};
int len=s1.size();
for(int i=0;i<len;i++){
ch[s1[i]-'a']++;
ch[s2[i]-'a']--;
}
for(int i=0;i<26;i++){
if(ch[i]!=0)
return false;
}
for(int i=1;i<s1.length();i++)
{
if(isScramble(s1.substr(0,i), s2.substr(0,i)) && isScramble(s1.substr(i), s2.substr(i)))
return true;
if(isScramble(s1.substr(0,i), s2.substr(s2.length()-i)) && isScramble(s1.substr(i), s2.substr(0,s2.length()-i)))
return true;
}
return false;
}
};