zoukankan      html  css  js  c++  java
  • [LeetCode] 131. Palindrome Partitioning Java

    题目:

    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"]
    ]

    题意及分析:给出一个字符串,分割之后所有的子串都是回文串,求出所有可能的分割方法。

    方法一:使用DFS方法查找,每次查找字符串头可能的回文串,然后切割掉,继续查找剩余的字符串s,如果最后s.length ==0 ,那么说明字符串可以全部分割为回文串,满足条件。添加到结果集中。

    代码:

    class Solution {
        public List<List<String>> partition(String s) {
            List<List<String>> res = new ArrayList<>();
            if(s==null || s.length() ==0 ) return res;
            //dfs??分割出每一个回文
            DFS(res,new ArrayList<String>(),s);
            return res;
        }
        private void DFS(List<List<String>> res ,List<String> arrayList,String s){
            if(s.length() == 0){
                res.add(new ArrayList<>(arrayList));
                return;
            }
            for(int i = 0;i<s.length();i++){
                String str = s.substring(0,i+1);
                if(isPalindrome(str)){
                    arrayList.add(str);
                    DFS(res,arrayList,s.substring(str.length()));
                    arrayList.remove(arrayList.size()-1);
                }
            }
    
        }
    
    
        private boolean isPalindrome(String s ){        //判断s是否是回文
            for(int i = 0;i<s.length()/2;i++){
                if(s.charAt(i) != s.charAt(s.length()-1-i)) return false;
            }
            return true;
        }
    }

     方法二:

    //方法二:利用一个二维数组保存字符串的子串是否为回文,这样不用每次都去查找
        public List<List<String>> partition(String s) {
            List<List<String>> res = new ArrayList<>();
            if(s==null || s.length() ==0 ) return res;
            //dfs??分割出每一个回文
            boolean[][] isPalindrome =  new boolean[s.length()][s.length()];        //boolean[i][j]记录i到j是否为回文
    
            for(int i=0;i<s.length();i++){
                for(int j = 0;j<=i;j++){
                    if(s.charAt(i)==s.charAt(j) && (i-j<=2||isPalindrome[j+1][i-1])){
                        isPalindrome[j][i] = true;
                    }
                }
            }
            dfs(isPalindrome,res,new ArrayList<String>(),s,0);
            return res;
        }
    
        private void dfs( boolean[][] isPalindrome, List<List<String>> res,List<String> list,String s,int pos){
            if(pos == s.length()){
                res.add(new ArrayList<>(list));
                return;
            }
    
            for(int i = pos;i<s.length();i++){
                if(isPalindrome[pos][i]){
                    list.add(s.substring(pos,i+1));
                    dfs(isPalindrome,res,list,s,i+1);
                    list.remove(list.size()-1);
                }
            }
        }
  • 相关阅读:
    UDP协议测试
    openstack ussusi ubuntu 20 centos8 dracut initqueue timeout
    wol linux远程通过数据帧自动开机
    openStack proformancee bottlenecks options optimized
    find 搜索排除搜索目录
    Ipv6
    golang学习笔记 ---日志库 logrus
    golang学习笔记---- 格式化IO
    golang学习笔记 --- struct 嵌套
    golang学习笔记---HTTPS
  • 原文地址:https://www.cnblogs.com/271934Liao/p/7681024.html
Copyright © 2011-2022 走看看