算法的重要性,我就很少说了吧,想去大厂,就必需要通过基础知识和业务逻辑面试+算法面试。因此,为了提升你们的算法能力,这个公众号后续天天带你们作一道算法题,题目就从LeetCode上面选 !今天和你们聊的问题叫作 分割回文串,咱们先来看题面:https://leetcode-cn.com/problems/palindrome-partitioning/
Given a string s, partition s such that every substring of the partition is a palindrome. Return all possible palindrome partitioning of s.面试
A palindrome string is a string that reads the same backward as forward.算法
题意
给定一个字符串 s,将 s 分割成一些子串,使每一个子串都是回文串。返回 s 全部可能的分割方案。
样例
示例:
输入: "aab"
输出:
[
["aa","b"],
["a","a","b"]
]ide
解题
https://www.jianshu.com/p/e1017e1674ea这是一道很综合的题目,结合了动态规划,深度搜索和回溯法。首先为了分割出回文串,咱们首先要写出判断回文串的方法,这里使用动态规划来判断回文串,并且能够存储子串的回文串的状况。isPalindrome[i][j]:表示i到j的子串是不是回文串。状态转移方程:isPalindrome[i][j] = isPalindrome[i+1][j-1] && s.charAt(i) == s.charAt(j)天然若是一个串是回文串,那么首尾必需要相等,而且中间也是子串。初始化,显然当i==j的时候都是回文串当串只有两个字符且相等的时候也是回文串。知道如何判断子串是不是回文串就好办了,而后只要模式化的深度搜索回溯便可 。public class Solution { /** * @param s: A string * @return: A list of lists of string */ List<List<String>> results; boolean[][] isPalindrome; /** * @param s: A string * @return: A list of lists of string */ public List<List<String>> partition(String s) { results = new ArrayList<>(); if (s == null || s.length() == 0) { return results; } getIsPalindrome(s); helper(s, 0, new ArrayList<Integer>()); return results; } private void getIsPalindrome(String s) { int n = s.length(); isPalindrome = new boolean[n][n]; for (int i = 0; i < n; i++) { isPalindrome[i][i] = true; } for (int i = 0; i < n - 1; i++) { isPalindrome[i][i + 1] = (s.charAt(i) == s.charAt(i + 1)); } for (int i = n - 3; i >= 0; i--) { for (int j = i + 2; j < n; j++) { isPalindrome[i][j] = isPalindrome[i + 1][j - 1] && s.charAt(i) == s.charAt(j); } } } private void helper(String s, int startIndex, List<Integer> partition) { if (startIndex == s.length()) { addResult(s, partition); return; } for (int i = startIndex; i < s.length(); i++) { if (!isPalindrome[startIndex][i]) { continue; } partition.add(i); helper(s, i + 1, partition); partition.remove(partition.size() - 1); } } private void addResult(String s, List<Integer> partition) { List<String> result = new ArrayList<>(); int startIndex = 0; for (int i = 0; i < partition.size(); i++) { result.add(s.substring(startIndex, partition.get(i) + 1)); startIndex = partition.get(i) + 1; } results.add(result); } }好了,今天的文章就到这里,若是以为有所收获,请顺手点个在看或者转发吧,大家的支持是我最大的动力。