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"]
  ]

Solution 0:

直接用DFS 做,实际上也是可以过Leetcode的检查的。

 public List<List<String>> partition(String s) {
List<List<String>> ret = new ArrayList<List<String>>();
if (s == null) {
return ret;
} dfs(s, 0, new ArrayList<String>(), ret);
return ret;
} public static void dfs(String s, int index, List<String> path, List<List<String>> ret) {
int len = s.length();
if (index == len) {
ret.add(new ArrayList<String>(path));
return;
} for (int i = index; i < len; i++) {
String sub = s.substring(index, i + 1);
if (!isPalindrome(sub)) {
continue;
} path.add(sub);
dfs(s, i + 1, path, ret);
path.remove(path.size() - 1);
}
} public static boolean isPalindrome(String s) {
int len = s.length();
int left = 0;
int right = len - 1; while (left < right) {
if (s.charAt(left) != s.charAt(right)) {
return false;
}
left++;
right--;
} return true;
}

Runtime: 520 ms

Solution 1:

用DFS 加上一个记忆。HashMap<String, Boolean> map 用它来记忆某一段是否回文,这样不用每一次都去判断回文。可以减少计算量。

 public List<List<String>> partition1(String s) {
List<List<String>> ret = new ArrayList<List<String>>();
List<String> path = new ArrayList<String>(); if (s == null) {
return ret;
} HashMap<String, Boolean> map = new HashMap<String, Boolean>(); dfs(s, path, ret, 0, map); return ret;
} public boolean isPalindrom(String s) {
int len = s.length();
if (len <= 1) {
return true;
} int left = 0;
int right = len - 1;
for (; left < right; left++, right--) {
if (s.charAt(right) != s.charAt(left)) {
return false;
}
} return true;
} /*
we use a map to store the solutions to reduce the times of computing.
*/
public void dfs(String s, List<String> path, List<List<String>> ret, int index, HashMap<String, Boolean> map) {
if (index == s.length()) {
ret.add(new ArrayList<String>(path));
return;
} for (int i = index; i < s.length(); i++) {
String sub = s.substring(index, i + 1); Boolean flag = map.get(sub);
if (flag == null) {
flag = isPalindrom(sub);
map.put(sub, flag);
} if (!flag) {
continue;
} path.add(sub);
dfs(s, path, ret, i + 1, map);
path.remove(path.size() - 1);
}
}

2014.12.29 Redo:

不过,最后的runtime没有什么大的改善。可能是数据量太小!

 // Solution 2: The DFS version with memory.
public List<List<String>> partition(String s) {
List<List<String>> ret = new ArrayList<List<String>>();
if (s == null) {
return ret;
} // bug: new map error.
dfs2(s, 0, new ArrayList<String>(), ret, new HashMap<String, Boolean>());
return ret;
} public static void dfs2(String s, int index, List<String> path, List<List<String>> ret, HashMap<String, Boolean> map) {
int len = s.length();
if (index == len) {
ret.add(new ArrayList<String>(path));
return;
} for (int i = index; i < len; i++) {
String sub = s.substring(index, i + 1);
if (!isPalindromeHash(sub, map)) {
continue;
} path.add(sub);
dfs2(s, i + 1, path, ret, map);
path.remove(path.size() - 1);
}
} // BUG 3: use boolean instead of Boolean.
public static boolean isPalindromeHash(String s, HashMap<String, Boolean> map) {
int len = s.length();
int left = 0;
int right = len - 1; if (map.get(s) != null) {
return map.get(s);
} map.put(s, true);
while (left < right) {
if (s.charAt(left) != s.charAt(right)) {
map.put(s, false);
return false;
}
left++;
right--;
} return true;
}

Runtime: 592 ms

Solution 2:

先用DP做一次判断是不是回文,然后再执行DFS,如果发现某条string不是回文,就可以直接退出,从而减少计算量。

 public List<List<String>> partition(String s) {
List<List<String>> ret = new ArrayList<List<String>>();
List<String> path = new ArrayList<String>(); if (s == null) {
return ret;
} boolean[][] isPalindrom = buildPalindromDP(s); dfs2(s, path, ret, 0, isPalindrom); return ret;
} /*
* Solution 2: Use DP to reduce the duplicate count.
* */
boolean[][] buildPalindromDP(String s) {
int len = s.length();
boolean[][] D = new boolean[len][len]; for (int j = 0; j < len; j++) {
for (int i = 0; i <= j; i++) {
if (j == 0) {
D[i][j] = true;
continue;
} D[i][j] = s.charAt(i) == s.charAt(j)
&& (j - i <= 2 || D[i + 1][j - 1]);
}
} return D;
} /*
we use a map to store the solutions to reduce the times of computing.
*/
public void dfs2(String s, List<String> path, List<List<String>> ret, int index, boolean[][] isPalindromDP) {
if (index == s.length()) {
ret.add(new ArrayList<String>(path));
return;
} for (int i = index; i < s.length(); i++) {
String sub = s.substring(index, i + 1);
if (!isPalindromDP[index][i]) {
continue;
} path.add(sub);
dfs2(s, path, ret, i + 1, isPalindromDP);
path.remove(path.size() - 1);
}
}

2014.12.29 Redo:

 // BUG 3: use boolean instead of Boolean.
public static boolean isPalindromeHash(String s, HashMap<String, Boolean> map) {
int len = s.length();
int left = 0;
int right = len - 1; if (map.get(s) != null) {
return map.get(s);
} map.put(s, true);
while (left < right) {
if (s.charAt(left) != s.charAt(right)) {
map.put(s, false);
return false;
}
left++;
right--;
} return true;
} // Solution 3: Use DP to determine the palindrome first.
public List<List<String>> partition(String s) {
List<List<String>> ret = new ArrayList<List<String>>();
if (s == null) {
return ret;
} int len = s.length(); // D[i][j]: if this a palindrom for s.substring(i, j + 1).
boolean[][] D = new boolean[len][len]; for (int j = 0; j < len; j++) {
for (int i = 0; i <= j; i++) {
D[i][j] = s.charAt(i) == s.charAt(j) && (j - i <= 2 || D[i + 1][j - 1]);
}
} // bug: new map error.
dfs3(s, 0, new ArrayList<String>(), ret, D);
return ret;
} public static void dfs3(String s, int index, List<String> path, List<List<String>> ret, boolean[][] D) {
int len = s.length();
if (index == len) {
ret.add(new ArrayList<String>(path));
return;
} for (int i = index; i < len; i++) {
String sub = s.substring(index, i + 1);
if (!D[index][i]) {
continue;
} path.add(sub);
dfs3(s, i + 1, path, ret, D);
path.remove(path.size() - 1);
}
}

Runtime: 524 ms, 实际上运行时间也没多少改善。可能是数据集大小的问题咯。

GitHub Link:

Partition.java

https://github.com/yuzhangcmu/LeetCode_algorithm/blob/master/dfs/Partition_2014_1229.java

LeetCode: Palindrome Partitioning 解题报告的更多相关文章

  1. 【LeetCode】131. Palindrome Partitioning 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 回溯法 日期 题目地址:https://leetco ...

  2. 【LeetCode】Palindrome Partitioning 解题报告

    [题目] Given a string s, partition s such that every substring of the partition is a palindrome. Retur ...

  3. [LeetCode] Palindrome Partitioning II 解题笔记

    Given a string s, partition s such that every substring of the partition is a palindrome. Return the ...

  4. LeetCode:Palindrome Partitioning,Palindrome Partitioning II

    LeetCode:Palindrome Partitioning 题目如下:(把一个字符串划分成几个回文子串,枚举所有可能的划分) Given a string s, partition s such ...

  5. LeetCode: Combination Sum 解题报告

    Combination Sum Combination Sum Total Accepted: 25850 Total Submissions: 96391 My Submissions Questi ...

  6. LeetCode: Palindrome Partitioning II 解题报告

    Palindrome Partitioning II Given a string s, partition s such that every substring of the partition ...

  7. 【LeetCode】336. Palindrome Pairs 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 HashTable 相似题目 参考资料 日期 题目地 ...

  8. [leetcode]Palindrome Partitioning II @ Python

    原题地址:https://oj.leetcode.com/problems/palindrome-partitioning-ii/ 题意: Given a string s, partition s  ...

  9. [leetcode]Palindrome Partitioning @ Python

    原题地址:https://oj.leetcode.com/problems/palindrome-partitioning/ 题意: Given a string s, partition s suc ...

随机推荐

  1. 搭建简单的网络部分(OC)框架

    准备工作 1.文件目录结构示图(按照MVC分层) 文件目录结构图/自定义Cell Controller: CYXOneViewController Model: CYXMenu View: CYXCe ...

  2. 我在阿里这仨月 前端开发流程 前端进阶的思考 延伸学习的方式很简单:google 一个关键词你能看到十几篇优秀的博文,再这些博文中寻找新的关键字,直到整个大知识点得到突破

    我在阿里这仨月 Alibaba 试用期是三个月,转眼三个月过去了,也到了转正述职的时间.回想这三个月做过的事情,很多很杂,但还是有重点. 本文谈一谈工作中遇到的各种场景,需要用到的一些前端知识,以及我 ...

  3. 【转】细说UI线程和Windows消息队列

    在Windows应用程序中,窗体是由一种称为“UI线程(User Interface Thread)”的特殊类型的线程创建的. 首先,UI线程是一种“线程”,所以它具有一个线程应该具有的所有特征,比如 ...

  4. 【java】详解I/O流

    目录结构: contents structure [+] File类 I/O流体系 流的基本介绍 访问文件 转化流 DataInputStream和DataOutputStream 对象流 推回输入流 ...

  5. SQL如何获得本季度第一天、一年的第一天、本月的最后一天

    nterval 参数,具有以下设定值: 设置 描述 Year yy, yyyy 年 quarter qq, q 季 Month mm, m 月 dayofyear dy, y 一年的日数 Day dd ...

  6. Android adjustresize全屏无效问题

    屏模式下,即使将activity的windowSoftInputMode的属性设置为:adjustResize,在键盘显示时它未将Activity的Screen向上推动,所以你Activity的vie ...

  7. dbms_random.seed

    语法: DBMS_RANDOM.SEED ( val IN BINARY_INTEGER); DBMS_RANDOM.SEED ( val IN VARCHAR2); val: Seed number ...

  8. SharePoint CAML In Action——Part II

    在SharePoint中,相对于Linq to SharePoint而言,CAML是轻量化的.当然缺点也是显而易见的,"Hard Code"有时会让你抓狂.在实际场景中,经常会根据 ...

  9. Excel Open Xml中CellStyleXfs,cellStyle,cellXfs之间关系的总结

    最近这几个东东打交道了几天,总算是弄明白了,综合多个帖子,现在总结如下: 在创建stylesheet时,必须创建fonts,Fills,Borders 和cellXfs(CellFormats)四个节 ...

  10. 怎么安装预装的win8三星笔记本改win7再装Ubuntu问题[zz]

    随着科技的高速发展,人们对电脑的要求越来越高,对电脑系统的要求亦是,那些电脑自带的系统,很多时候已经无法满足人们的需求了,而为了满足自己的需求,人们往往会为电脑改装新系统,而本文要和大家一起分享的话题 ...