131. 分割回文串

给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。

返回 s 所有可能的分割方案。

示例:

输入: “aab”

输出:

[
["aa","b"],
["a","a","b"]
]
class Solution {
int len;
ArrayList<List<String>> res = new ArrayList<>();
String s;
boolean[][] dp; public List<List<String>> partition(String s) {
this.s = s;
len = s.length(); if (len < 1)
return res; // dp[i][j] 表示某一子串,s.substring(i, j + 1)
// 例如 s="babad",dp[0][0] = "b",dp[0][4] = "babad"
dp = new boolean[len][len];
// one character
// 斜着遍历 [0,0] -> [1,1] -> ...
// 单个字符均为回文
for (int i = 0; i < len; i++) {
dp[i][i] = true;
}
// two character
// 斜着遍历 [0,1] -> [1,2] -> ...
// 两个字符均相同才是回文
for (int i = 0; i < len - 1; i++) {
dp[i][i + 1] = s.charAt(i) == s.charAt(i + 1);
}
// others
// 开始dp, 此子串 = 字符 + 左下角的子串 + 字符
// 只有左下角是回文,同时两端添加的字符相同时,才是回文
for (int i = 2; i < len; i++) {
for (int j = 0; j < len - i; j++) {
dp[j][j + i] = dp[j + 1][j + i - 1] && s.charAt(j) == s.charAt(j + i);
}
}
//回溯法,穿串串
foo(new LinkedList<>(),0); return res;
} void foo(LinkedList<String> path, int level) {
if (level >= len) {
res.add(new ArrayList<>(path));
return;
} for (int i = level; i < len; i++) {
if (dp[level][i]) {
path.add(s.substring(level, i + 1));
foo(path, i + 1);
path.removeLast();
}
}
} }

最新文章

  1. 【leetcode】Longest Substring Without Repeating Characters
  2. Linux-1:安装&amp;忘记密码&amp;CRT连接centos 6.5
  3. iOS 微信分享
  4. HTML5,jQuery,ajax基础面试
  5. Moon River
  6. CSS3 display:flex和display:box有什么区别
  7. wp7 HubTile
  8. python join split
  9. Windows上Python2.7安装Scrapy过程
  10. XMPP协议简介
  11. 第6章 Overlapped I/O, 在你身后变戏法 ---Win32 文件操作函数 -2
  12. g4e基础篇#6 了解Git历史记录
  13. 设计模式 --&gt; (17)状态模式
  14. Ubuntu 16.04 屏幕亮度无法调节怎么办
  15. 我的小OJ
  16. 洛谷P1880 石子合并(环形石子合并 区间DP)
  17. Mysql的用户管理
  18. CPanel/服务器文件及目录
  19. Linux网络编程学习(三) ----- 进程控制实例(第三章)
  20. Java关于struts2框架

热门文章

  1. MySQL索引及查询优化
  2. 05 返回静态文件的多线程web框架
  3. LinkedList详解-源码分析
  4. MySQL(7)— 索引
  5. java第十二周课后作业0523
  6. Istio-架构
  7. MyBatis通过注解方式批量添加、修改、删除
  8. SpringBoot入门系列(十二)统一日志收集
  9. CentOS 安装 git2.x.x 版本
  10. Bank5