IT技術小屋

          秋風秋雨,皆入我心

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            38 隨筆 :: 1 文章 :: 19 評論 :: 0 Trackbacks
          Given a string s, partition s such that every substring of the partition is a palindrome.
          Return all possible palindrome partitioning of s.
          For example, given s = "aab",
          Return
          [
              ["aa","b"],
              ["a","a","b"]
          ]

          這個題目考慮用動態規劃解題,關鍵在于構造一個解空間,確定S的任意子串S(i, j)是不是對稱的。判斷標準如下:
          1、如果i == j,則S(i, j)是對稱的;
          2、如果j - i == 1 && S[i] == S[j],則S(i, j)是對稱的;
          3、如果j - i > 1 && S[i] == S[j] && S(i + 1, j - 1)是對稱的,則S(i, j)也是對稱的。
          在構造完這樣的解空間后,就可以在O(1)時間內判定任意子串是不是對稱的了。算法實現如下:
           1 public class PalindromePartitioning {
           2     public ArrayList<ArrayList<String>> partition(String s) {
           3         ArrayList<ArrayList<String>> ret = new ArrayList<ArrayList<String>>();
           4         ArrayList<String> r = new ArrayList<String>();
           5         int length = s.length();
           6         boolean[][] map = new boolean[length][length];
           7         findPartition(s, 0, ret, r, map);
           8         return ret;
           9     }
          10 
          11     private void findPartition(String s, int start,
          12             ArrayList<ArrayList<String>> ret, ArrayList<String> r,
          13             boolean[][] map) {
          14         int length = s.length();
          15         if (start == length && r.size() != 0) {
          16             ArrayList<String> clone = new ArrayList<String>(r);
          17             ret.add(clone);
          18         } else {
          19             for (int j = start; j < length; j++) {
          20                 if (start == j
          21                         || (j - start > 1 && s.charAt(start) == s.charAt(j) && map[start + 1][j - 1])
          22                         || (j - start == 1 && s.charAt(start) == s.charAt(j))) {
          23                     map[start][j] = true;
          24                     r.add(s.substring(start, j + 1));
          25                     findPartition(s, j + 1, ret, r, map);
          26                     r.remove(r.size() - 1);
          27                 }
          28             }
          29         }
          30     }
          31 }
          posted on 2013-12-19 17:03 Meng Lee 閱讀(1238) 評論(0)  編輯  收藏 所屬分類: Leetcode
          主站蜘蛛池模板: 彰化市| 闻喜县| 基隆市| 河北区| 乌苏市| 天等县| 根河市| 扬州市| 伊宁市| 中方县| 博爱县| 绥德县| 通道| 辽宁省| 黑山县| 灵武市| 宝兴县| 驻马店市| 邵东县| 通州市| 甘南县| 玉田县| 金山区| 东宁县| 曲麻莱县| 社旗县| 汉沽区| 临邑县| 葵青区| 崇仁县| 晋宁县| 沈阳市| 石狮市| 龙川县| 临潭县| 栾城县| 徐水县| 石林| 玛曲县| 宕昌县| 宣汉县|