1. 程式人生 > >[leetcode] 87. Scramble String (Hard)

[leetcode] 87. Scramble String (Hard)

 題意:

判斷兩個字串是否互為Scramble字串,而互為Scramble字串的定義:

字串看作是父節點,從字串某一處切開,生成的兩個子串分別是父串的左右子樹,再對切開生成的兩個子串繼續切開,直到無法再切,此時生成為一棵二叉樹。對二叉樹的任一子樹可任意交換其左右分支,如果S1可以通過交換變成S2,則S1,S2互為Scramble字串。

思路:

對於分割後的子串,應有IsScramble(s1[0,i] , s2[0,i]) && IsSCramble(s1[i,length] , s2[i,length])

因為分割後可以交換子串,於是也可能有IsScramble(s1[0,i] , s2[length-i,length]) 同時 IsScramble(s1[i,length] , s2[0,length-i])

注意剪枝條件:如果兩串長度不同,false;如果兩串所含字元種類不同,false。

Runtime: 0 ms, faster than 100.00% of C++ online submissions for Scramble String.

class Solution
{
public:
  bool isScramble(string s1, string s2)
  {
    if (s1.length() != s2.length())
      return false;
    if (s1 == s2)
      return true;
    int
check[26] = {0}; int i; for (i = 0; i < s1.length(); ++i) { ++check[s1[i] - 'a']; --check[s2[i] - 'a']; } for (i = 0; i < 26; ++i) { if (check[i] != 0) return false; } for (i = 1; i < s1.size(); i++) { if ( (isScramble(s1.substr(
0, i), s2.substr(0, i)) && isScramble(s1.substr(i), s2.substr(i))) || (isScramble(s1.substr(0, i), s2.substr(s1.size() - i)) && isScramble(s1.substr(i), s2.substr(0, s1.size() - i)))) return true; } return false; } };