【LeetCode】87. Scramble String
2016-04-12 16:35
246 查看
题目:
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.
提示:
这道题可以用递归方法较为简单地解决,递归的形式可以这样:// recursive solution, the idea is based on the binary tree struct. 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; } }
结合题目的意思,如果两个单词是scramble的话,那么他们可能会有非叶子节点进行了逆序的操作,因此我们需要同时判断:
s1的左子节点与s2的左子节点,s1的右子节点与s2的右子节点
s1的左子节点与s2的右子节点,s1的右子节点与s2的左子节点
另外在进行递归前,需要对字符串是否相等,长度是否相等,是否是变位词进行判断。
代码:
class Solution {
public:
bool isScramble(string s1, string s2) {
// equal ?
if (s1 == s2) {
return true;
}
// if length are differrent, they can not be scramble
if (s1.length() != s2.length()) {
return false;
}
// just like anagram
vector<int> a(256, 0);
for (int i = 0; i < s1.length(); ++i) {
++a[s1[i]];
--a[s2[i]];
}
for (int i = 0; i < s1.length(); ++i) {
if (a[s1[i]] != 0) {
return false;
}
}
// recursive solution, the idea is based on the binary tree struct. 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;
}
};
相关文章推荐