Scramble String
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 {//passed small only
public:
bool isScramble(string s1, string s2) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if (s1.size() == 1) return s1[0] == s2[0];
if (s1.empty() || s1.compare(s2) == 0) return true;
int const max_index = s1.length()-1;
for(int ii = 1; ii <= max_index; ++ii){
string const s1_left = s1.substr(0, ii);
string const s1_right = s1.substr(ii, s1.length()-ii);
string const s2_left1 = s2.substr(0,ii);
string const s2_right1 = s2.substr(ii, s2.length()-ii);
string const s2_left2 = s2.substr(s2.length()-ii, ii);
string const s2_right2 = s2.substr(0, s2.length()-ii);
if (isScramble(s1_left, s2_left1) && isScramble(s1_right, s2_right1)
|| isScramble(s1_left, s2_left2) && isScramble(s1_right, s2_right2))
return true;
}
return false;
}
};
class Solution {//passed large
vector<vector<vector<int> > > record;
string sa,sb;
public:
bool process(int pos1, int pos2, int length){
if (length == 1) return sa[pos1] == sb[pos2];
if (length == 0) return true;
if (record[pos1][pos2][length] == 1) return true;
if (record[pos1][pos2][length] == -1) return false;
for(int ii = 1; ii < length; ++ii){//ii is size_left
int const size_right = length - ii;
if (process(pos1, pos2, ii) && process(pos1+ii, pos2+ii, size_right)
|| process(pos1, pos2+length-ii,ii) && process(pos1+ii, pos2, size_right)){
record[pos1][pos2][length] = 1;
return true;
}
}
record[pos1][pos2][length] = -1;
return false;
}
bool isScramble(string s1, string s2) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
sa = s1;
sb = s2;
record.clear();
record.assign(s1.length()+1,vector<vector<int> >(s1.length()+1, vector<int>(s1.length()+1, 0)));
return process(0,0,s1.length());
}
};
1 comment:
The problem looks same as that of the anagram of string.
Shouldn't we just match the frequency of each character present.
Post a Comment