IT技術小屋

          秋風秋雨,皆入我心

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            38 隨筆 :: 1 文章 :: 19 評論 :: 0 Trackbacks
          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.

           1 public class ScrambleString {
           2     public boolean isScramble(String s1, String s2) {
           3         if (s1.length() != s2.length())
           4             return false;
           5         if (s1.equals(s2))
           6             return true;
           7 
           8         int[] A = new int[26];
           9         for (int i = 0; i < s1.length(); i++) {
          10             ++A[s1.charAt(i) - 'a'];
          11         }
          12 
          13         for (int j = 0; j < s2.length(); j++) {
          14             --A[s2.charAt(j) - 'a'];
          15         }
          16 
          17         for (int k = 0; k < 26; k++) {
          18             if (A[k] != 0)
          19                 return false;
          20         }
          21 
          22         for (int i = 1; i < s1.length(); i++) {
          23             boolean result = isScramble(s1.substring(0, i), s2.substring(0, i))
          24                     && isScramble(s1.substring(i), s2.substring(i));
          25             result = result
          26                     || (isScramble(s1.substring(0, i),
          27                             s2.substring(s2.length() - i, s2.length())) && isScramble(
          28                             s1.substring(i), s2.substring(0, s2.length() - i)));
          29             if (result)
          30                 return true;
          31         }
          32         return false;
          33     }
          34 }
          posted on 2014-01-05 12:33 Meng Lee 閱讀(227) 評論(0)  編輯  收藏 所屬分類: Leetcode
          主站蜘蛛池模板: 磐石市| 新宾| 晴隆县| 平武县| 黄浦区| 安多县| 星子县| 江永县| 西城区| 鄂尔多斯市| 罗城| 桐庐县| 临安市| 瑞昌市| 昭平县| 新乡县| 泗洪县| 法库县| 隆林| 伊宁县| 灵台县| 南华县| 广饶县| 家居| 广安市| 涟水县| 中宁县| 宜城市| 彩票| 遂川县| 遂宁市| 苗栗县| 昌邑市| 黄平县| 和顺县| 潍坊市| 巨野县| 禹州市| 湖南省| 岳阳市| 南丰县|