[leetcode] 87. Scramble String (Hard)
阿新 • • 發佈:2018-11-28
題意:
判斷兩個字串是否互為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; intcheck[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; } };