博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leetcode----131. Palindrome Partitioning
阅读量:4112 次
发布时间:2019-05-25

本文共 2200 字,大约阅读时间需要 7 分钟。

链接:

大意:

给定一个字符串s,要求给出s的所有切分情况,使得切分后的每个子串都是回文串。例子:

思路:

记录一个二维boolean数组p,p[i][j]意为s.substring(i, j + 1)是否为回文串。

接下来就是基于上一步求得的boolean数组p使用回溯法了。 

具体思路看代码。

代码:

class Solution {    public List
> partition(String s) { List
> res = new ArrayList<>(); if (s.length() == 0) return res; int len = s.length(); boolean[][] p = new boolean[len][len]; // p[i][j]:s.substring(i, j + 1)是否为回文串 for (int i = 0; i < len; i++) { for (int j = i; j < len; j++) { if (isPalindrome(s, i, j)) p[i][j] = true; } } dfs(s, p, 0, len, new ArrayList<>(), res); return res; } // r为当前的p为第几行 从0开始 public void dfs(String s, boolean[][] p, int r, int len, List
list, List
> res) { int i = r; while (i < len) { if (p[r][i]) { // 找到一组分割 if (i == len - 1) { res.add(new ArrayList<>(list)); res.get(res.size() - 1).add(s.substring(r, i + 1)); return ; } list.add(s.substring(r, i + 1)); dfs(s, p, i + 1, len, list, res); // s.substring(r, i + 1)为回文串 则下一个可能的回文串起始位置从 i + 1 开始 list.remove(list.size() - 1); // 回溯 } i++; } } // 判断s从start到end(含)是否为回文串 public boolean isPalindrome(String s, int start, int end) { while (start < end) { if (s.charAt(start) != s.charAt(end)) return false; start++; end--; } return true; }}

结果:

结论:

享受AC带来的快感,感觉现在做题越来越有算法设计的意思了... 

四个月后再刷:

class Solution {    public List
> partition(String s) { List
> res = new ArrayList<>(); dfs(s.toCharArray(), 0, res, new LinkedList
()); return res; } // 含左不含右 public void dfs(char[] array, int left, List
> res, LinkedList
list) { if (left == array.length) { res.add(new ArrayList<>(list)); } for (int right = left + 1; right <= array.length; right++) { if (isHuiWen(array, left, right)) { list.addLast(new String(array, left, right - left));// 三个参数: char[] offset count dfs(array, right, res, list); list.removeLast(); // 回溯 } } } public boolean isHuiWen(char[] array, int left, int right) { while (left < right) { if (array[left++] != array[--right]) return false; } return true; }}

 

 

 

转载地址:http://cxesi.baihongyu.com/

你可能感兴趣的文章
弱类型、强类型、动态类型、静态类型语言的区别是什么?
查看>>
Struts2技术内幕图书 转载
查看>>
Java异常分类
查看>>
项目中的jackson与json-lib使用比较
查看>>
Jackson Tree Model Example
查看>>
j2ee-验证码
查看>>
日志框架logj的使用
查看>>
js-高德地图规划路线
查看>>
常用js收集
查看>>
mydata97的日期控件
查看>>
如何防止sql注入
查看>>
maven多工程构建与打包
查看>>
springmvc传值
查看>>
Java 集合学习一 HashSet
查看>>
在Eclipse中查看Android源码
查看>>
Android-Socket登录实例
查看>>
Android使用webservice客户端实例
查看>>
层在页面中的定位
查看>>
[转]C语言printf
查看>>
C 语言 学习---获取文本框内容及字符串拼接
查看>>