zoukankan      html  css  js  c++  java
  • 131. Palindrome Partitioning

    一、题目

      1、审题

      

      2、分析

        给出一个字符串,将其分割成各个子串,使得其子串全为回文,求所有的分割方式。

    二、解答

      1、思路: 

        方法一、

          采用递归方式进行分割。

          ①、递归时,判断当前分割的子串是否为回文,若是,存储该子串,并分割字符串,继续递归剩下的子串;

          ②、递归跳出条件为: 当前字符串切割的字符下标 i >=  字符串的长度 ;

        public List<List<String>> partition(String s) {
            
            List<List<String>> resultList = new ArrayList<>();
            backTrack(resultList, new ArrayList<String>(), s, 0);
            return resultList;
        }
        private void backTrack(List<List<String>> resultList, ArrayList<String> curList, String s, int i) {
            
            if(curList.size() > 0 && i >= s.length()) {
                resultList.add(new ArrayList<String>(curList));
                return;
            }
            for (int j = i; j < s.length(); j++) {
                if(isPalindrome(s, i, j)) {
                    curList.add(s.substring(i, j + 1));
                    backTrack(resultList, curList, s, j + 1);
                    curList.remove(curList.size() - 1);
                }
            }
        }
        private boolean isPalindrome(String s, int l, int r) {
            while(l < r) {
                if(s.charAt(l++) != s.charAt(r--))
                    return false;
            }
            return true;
        }

       方法二、

        采用 DP + DFS 进行实现。

        采用一个动态数组 DP 记录是否为回文,代替每一次递归进行回文判断。 DP[i][j] = true: 表示 s 中 从下标 i 到 下标 j 之间的字符串是回文。

        再采用递归进行 DFS 遍历,将 s 的所有切割的回文子串进行记录。

        public List<List<String>> partition2(String s) {
            
            List<List<String>> resultList = new ArrayList<>();
            boolean[][] dp = new boolean[s.length()][s.length()];
            
            for (int i = 0; i < s.length(); i++) {
                for (int j = 0; j <= i; j++) {
                    if(s.charAt(j) == s.charAt(i) && (i - j <= 2 || dp[j+1][i-1])) {
                        dp[j][i] = true;
                    }
                }
            }
            partitionHelper(resultList, new ArrayList<String>(), dp, s, 0);
            return resultList;
        }
        
        private void partitionHelper(List<List<String>> resultList, ArrayList<String> arrayList, 
                                    boolean[][] dp, String s, int i) {
            if(arrayList.size() > 0 && i >= s.length()) {
                resultList.add(new ArrayList<>(arrayList));
                return;
            }
            for(int j = i; j < s.length(); j++) {
                if(dp[i][j]) {
                    arrayList.add(s.substring(i, j + 1));
                    partitionHelper(resultList, arrayList, dp, s, j + 1);
                    arrayList.remove(arrayList.size() - 1);
                }
            }
        }
  • 相关阅读:
    校园商铺-8商品模块-12接触商品与某商品类别的关联的实现
    centos 7访问windows共享文件夹
    怎样在CentOS 7.0上安装和配置VNC服务器
    【总结】教你怎么将centos7打造成桌面系统
    Centos 7安装gvim
    CentOS 7 安装virtualBox
    Centos 7中 vim 中文乱码
    CentOS 7 gedit编辑器中文乱码解决方法
    centos7支持ntfs
    delta
  • 原文地址:https://www.cnblogs.com/skillking/p/9754611.html
Copyright © 2011-2022 走看看