您的位置:首页 > 其它

LeetCode-Scramble String

2013-09-22 16:15 316 查看
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.

class Solution {
public:
bool isS(string& s1,string& s2,int begin1,int begin2,int end1,int end2)
{
int length1=end1-begin1+1;
int length2=end2-begin2+1;

if(length1!=length2)return false;

if(length1==1){
if(s1[begin1]==s2[begin2])return true;
else return false;
}
else{
vector<int> count;
count.resize(26);
for(int i=0;i<26;i++)count[i]=0;
for(int i=begin1;i<=end1;i++){
count[s1[i]-'a']++;
}
for(int i=begin2;i<=end2;i++){
count[s2[i]-'a']--;
}
for(int i=0;i<26;i++){
if(count[i]!=0){
return false;
}
}
for(int i=1;i<length1;i++){
bool b1,b2,b3,b4;
int j=length1-i;
b1=isS(s1,s2,begin1,begin2,begin1+i-1,begin2+i-1);
b2=isS(s1,s2,begin1+i,begin2+i,end1,end2);
b3= isS(s1,s2,begin1,end2-i+1,begin1+i-1,end2);
b4=isS(s1,s2,begin1+i,begin2,end1,begin2+j-1);
if(
b1&&b2
||
b3&&b4
)
return true;
}
return false;
}
}
bool isScramble(string s1, string s2) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
return isS(s1,s2,0,0,s1.length()-1,s2.length()-1);
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: