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 閱讀(1234) 評論(0)  編輯  收藏 所屬分類: Leetcode
          主站蜘蛛池模板: 柘荣县| 嘉禾县| 来安县| 新龙县| 彰化县| 定安县| 珲春市| 周至县| 黄石市| 蓬安县| 宁南县| 水城县| 井研县| 潼南县| 洛浦县| 泸水县| 噶尔县| 钟祥市| 扎鲁特旗| 龙游县| 安丘市| 金山区| 玉门市| 大渡口区| 临朐县| 化隆| 和平县| 庄河市| 曲靖市| 新巴尔虎右旗| 龙州县| 东乡县| 聂拉木县| 梨树县| 淅川县| 波密县| 霍城县| 土默特左旗| 眉山市| 乌鲁木齐县| 泰顺县|