Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrings recursively.node
Below is one possible representation of s1 = "great"
:ide
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.post
For example, if we choose the node "gr"
and swap its two children, it produces a scrambled string "rgeat"
.idea
rgeat / \ rg eat / \ / \ r g e at / \ a t
We say that "rgeat"
is a scrambled string of "great"
.spa
Similarly, if we continue to swap the children of nodes "eat"
and "at"
, it produces a scrambled string "rgtae"
.code
rgtae / \ rg tae / \ / \ r g ta e / \ t a
We say that "rgtae"
is a scrambled string of "great"
.blog
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的話,那麼他們可能會有非葉子節點進行了逆序的操做,所以咱們須要同時判斷:string
另外在進行遞歸前,須要對字符串是否相等,長度是否相等,是不是變位詞進行判斷。
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; } };