LeetCode: Palindrome Partitioning 解题报告
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:
https://github.com/yuzhangcmu/LeetCode_algorithm/blob/master/dfs/Partition_2014_1229.java
LeetCode: Palindrome Partitioning 解题报告的更多相关文章
- 【LeetCode】131. Palindrome Partitioning 解题报告(Python & C++)
		作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 回溯法 日期 题目地址:https://leetco ... 
- 【LeetCode】Palindrome Partitioning 解题报告
		[题目] Given a string s, partition s such that every substring of the partition is a palindrome. Retur ... 
- [LeetCode] Palindrome Partitioning II 解题笔记
		Given a string s, partition s such that every substring of the partition is a palindrome. Return the ... 
- LeetCode:Palindrome Partitioning,Palindrome Partitioning II
		LeetCode:Palindrome Partitioning 题目如下:(把一个字符串划分成几个回文子串,枚举所有可能的划分) Given a string s, partition s such ... 
- LeetCode: Combination Sum 解题报告
		Combination Sum Combination Sum Total Accepted: 25850 Total Submissions: 96391 My Submissions Questi ... 
- LeetCode: Palindrome Partitioning II  解题报告
		Palindrome Partitioning II Given a string s, partition s such that every substring of the partition ... 
- 【LeetCode】336. Palindrome Pairs 解题报告(Python)
		作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 HashTable 相似题目 参考资料 日期 题目地 ... 
- [leetcode]Palindrome Partitioning II @ Python
		原题地址:https://oj.leetcode.com/problems/palindrome-partitioning-ii/ 题意: Given a string s, partition s ... 
- [leetcode]Palindrome Partitioning @ Python
		原题地址:https://oj.leetcode.com/problems/palindrome-partitioning/ 题意: Given a string s, partition s suc ... 
随机推荐
- [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Date' for property 'beginTime';
			依照https://stackoverflow.com/questions/23702041/failed-to-convert-property-value-of-type-java-lang-st ... 
- 记录EntityValidationErrors的详细信息
			0.一个问题 使用过EF的人相信都会遇到Validation failed for one or more entities. See ‘EntityValidationErrors’这种异常,这是由 ... 
- C# winform DataGridView 常见属性
			C# winform DataGridView 属性说明① 取得或者修改当前单元格的内容 ② 设定单元格只读 ③ 不显示最下面的新行 ④ 判断新增行 ⑤ 行的用户删除操作的自定义 ⑥ 行.列的隐藏和删 ... 
- spring cloud 之 Feign  使用HTTP请求远程服务
			一.Feign 简介 在spring Cloud Netflix栈中,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使用HTTP客户端.我们可以使用JDK原生的URLCo ... 
- 如何提升RDS响应速度
			如果采用短连接的方式连接RDS,请在与RDS相连的云服务器上执行以下命令来提升RDS响应速度.(注:云服务器要有公网带宽) 1.安装nscd 云服务器上执行命令 Ubuntu系统执行:apt-get ... 
- eclipse 反编译插件 jadclipse
			1. 下载 JadClipse 下载JadClipse:http://jadclipse.sourceforge.net/wiki/index.php/Main_Page#Download 注意选择与 ... 
- [转]学习笔记_springmvc注解形式的开发参数接收
			springmvc基于注解的开发 注解第一个例子 1. 创建web项目 2. 在springmvc的配置文件中指定注解驱动,配置扫描器 <!-- sprimgmvc 注解驱动 --> &l ... 
- 常用代码之八:setTimeout 和 clearTimeout。
			1.先写一个错误的例子: function DealSomething() { //write some code window.setTimeout(function ... 
- python标准库介绍——32     Queue  模块详解
			Queue 模块 ``Queue`` 模块提供了一个线程安全的队列 (queue) 实现, 如 [Example 3-2 #eg-3-2] 所示. 你可以通过它在多个线程里安全访问同个对象. ==== ... 
- springboot 项目单元测试
			项目结构如下 1 引入测试的 maven 依赖 <dependency> <groupId>org.springframework.boot</groupId> & ... 
