zoukankan      html  css  js  c++  java
  • lintcode136- Palindrome Partitioning- medium

    Given a string s, partition s such that every substring of the partition is a palindrome.

    Return all possible palindrome partitioning of s.

    Example

    Given s = "aab", return:

    [
      ["aa","b"],
      ["a","a","b"]
    ]

    DFS。想成每次从允许的index开始,for循环试试切割到某个位置拿出字符串来。如果切出不是回文的肯定不合格,放弃。如果切出的是回文的,那递归检查后面的substring们。如果切出来的正好切完最后一个字母了,那之前切法就是合格的,出口了放入result。

    这里有一个可以优化的地方,就是提前把boolean[][] isPalindrome 数组准备好,之后就可以在重复寻求判断的时候O(1)而不是O(string长度)拿到结果。进一步优化创造boolean[][]数组的方法是动态规划,isPalindrome[i][j] = isPalindrome[i+1][j-1] && s.charAt(i) == s.charAt(j),每个

    1. 普通准备boolean[][]数字

    public class Solution {
        /*
         * @param s: A string
         * @return: A list of lists of string
         */
        public List<List<String>> partition(String s) {
            // write your code here
            List<List<String>> result = new ArrayList<>();
            if (s == null) {
                return result;
            }
            if (s.length() == 0) {
                List<String> list = new ArrayList<>();
                list.add("");
                result.add(list);
                return result;
            }
            
            boolean[][] isPalindromes = new boolean[s.length()][s.length()];
            for (int i = 0; i < s.length(); i++) {
                for (int j = i; j < s.length(); j++) {
                    isPalindromes[i][j] = isPalindrome(s.substring(i, j+1));
                }
            }
            
            dfs(s, 0, isPalindromes, new ArrayList<String>(), result);
            return result;
        }
        
        private void dfs(String s, int idx, boolean[][] isPalindromes, List<String> crt, List<List<String>> result) {
            
            if (idx == s.length()) {
                result.add(new ArrayList<String>(crt));
                return;
            }
            
            for (int i = idx; i < s.length(); i++) {
                if (!isPalindromes[idx][i]) {
                    continue;
                }
                crt.add(s.substring(idx, i + 1));
                dfs(s, i + 1, isPalindromes, crt, result);
                crt.remove(crt.size() - 1);
            }
        }
        
        private boolean isPalindrome(String s) {
            for (int i = 0, j = s.length() - 1; i < j; i++, j--) {
                if (s.charAt(i) != s.charAt(j)) {
                    return false;
                }
            }
            return true;
        }
    }

    2.动态规划准备boolean[][]数组(最好纸上画一下ij的矩阵,来判断下要利用boolean[i+1][j-1]的话要先准备哪些数据,之后要按什么顺序来算。实际上是先准备对角线[i][i]一条,对角线右侧[i][i+1]一条,之后要让i从下往上,j从左到右来算。)

    public class Solution {
        /*
         * @param s: A string
         * @return: A list of lists of string
         */
        public List<List<String>> partition(String s) {
            // write your code here
            List<List<String>> result = new ArrayList<>();
            if (s == null) {
                return result;
            }
            if (s.length() == 0) {
                List<String> list = new ArrayList<>();
                list.add("");
                result.add(list);
                return result;
            }
            
            boolean[][] isPalindromes = isPalindromes(s);
            dfs(s, 0, isPalindromes, new ArrayList<String>(), result);
            return result;
        }
        
        private void dfs(String s, int idx, boolean[][] isPalindromes, List<String> crt, List<List<String>> result) {
            
            if (idx == s.length()) {
                result.add(new ArrayList<String>(crt));
                return;
            }
            
            for (int i = idx; i < s.length(); i++) {
                if (!isPalindromes[idx][i]) {
                    continue;
                }
                crt.add(s.substring(idx, i + 1));
                dfs(s, i + 1, isPalindromes, crt, result);
                crt.remove(crt.size() - 1);
            }
        }
        
        private boolean[][] isPalindromes(String s) {
            boolean[][] isPalindromes = new boolean[s.length()][s.length()];
            
            for (int i = 0; i < s.length(); i++) {
                isPalindromes[i][i] = true;
            }
            for (int i = 0; i < s.length() - 1; i++) {
                isPalindromes[i][i + 1] = s.charAt(i) == s.charAt(i + 1);
            }
            for (int i = s.length() - 3; i >= 0; i--) {
                for (int j = i + 2; j < s.length(); j++) {
                    isPalindromes[i][j] = isPalindromes[i + 1][j - 1] && s.charAt(i) == s.charAt(j);
                }
            }
            return isPalindromes;
        }
    }
  • 相关阅读:
    猜数字小游戏的设计
    实验三 敏捷开发与XP实践 实验报告
    实验二Java面向对象程序设计
    课程总结报告
    Android实践项目汇报总结(下)
    Android实践项目汇报总结(上)修改
    Android项目开发四
    Android项目开发三
    Android项目开发二
    Android项目开发一
  • 原文地址:https://www.cnblogs.com/jasminemzy/p/7776343.html
Copyright © 2011-2022 走看看