当前位置:   article > 正文

【回溯】131. 分割回文串_给定一个字符串 s ,请将 s 分割成一些子串,使每个子串都是 回文串 ,返回 s 所有可

给定一个字符串 s ,请将 s 分割成一些子串,使每个子串都是 回文串 ,返回 s 所有可

题目:

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

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

示例: 输入: "aab" 输出: [ ["aa","b"], ["a","a","b"] ]

题解:

切割字符串类似于组合,可以画成二叉树的形式。

步骤:

1.递归函数参数

定义全局变量path存放切割后回文的子串,res存放结果集。 (这两个参数可以放到函数参数里)

本题递归函数参数还需要startIndex,因为切割过的地方,不能重复切割,和组合问题也是保持一致的。

2.递归函数终止条件

从树形结构的图中可以看出:切割线切到了字符串最后面,说明找到了一种切割方法,此时就是本层递归的终止终止条件。

3.单层搜索的逻辑

首先判断这个子串是不是回文,如果是回文,就加入path中,path用来记录切割过的回文子串。

判断回文: 

  1. public boolean isPalindrome(String s, int start, int end) {
  2. for (int i = start, j = end; i < j; i++, j--) {
  3. if (s.charAt(i) != s.charAt(j)) {
  4. return false;
  5. }
  6. }
  7. return true;
  8. }

完整代码: 

  1. class Solution {
  2. LinkedList<String> path = new LinkedList<>();
  3. List<List<String>> res = new LinkedList<>();
  4. public List<List<String>> partition(String s) {
  5. backtracking(s, 0);
  6. return res;
  7. }
  8. public void backtracking(String s, int startIndex) {
  9. if (startIndex == s.length()) {
  10. res.add(new LinkedList<>(path));
  11. return;
  12. }
  13. for (int i = startIndex; i < s.length(); i++) {
  14. if (isPalindrome(s, startIndex, i)) { //注意isPalindrome函数后两个参数是什么,检查的是同一个树层的回文情况
  15. String str = s.substring(startIndex, i + 1); //substring左闭右开
  16. path.add(str);
  17. } else {
  18. continue;
  19. }
  20. backtracking(s, i + 1);
  21. path.remove(path.size() - 1);
  22. }
  23. }
  24. public boolean isPalindrome(String s, int start, int end) {
  25. for (int i = start, j = end; i < j; i++, j--) {
  26. if (s.charAt(i) != s.charAt(j)) {
  27. return false;
  28. }
  29. }
  30. return true;
  31. }
  32. }

参考:代码随想录 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/676755
推荐阅读
相关标签
  

闽ICP备14008679号