LeetCode 0132 Palindrome Partitioning II

LeetCode 0132 Palindrome Partitioning II

原题传送门

1. 题目描述

2. Solution 1

1、思路分析
1> 状态定义: dp[i] 表示以s[0, i]的最少分割次数。
2> 边界: dp[i] = i。至少,单个字符就是回文的。
3> 状态转移方程:
遍历s,设工作变量为mid,表示回文的中心位置
case 1: s长度是奇数,中心位置在mid下标处,延伸至两端。
case 2: s长度是偶数,中心位置在[mid-1, mid]之间的缝,延伸至两端。

2、代码实现

package Q0199.Q0132PalindromePartitioningII;import java.util.stream.IntStream;public class Solution {    public int minCut(String s) {        // corner case        if (s == null || s.length() <= 1) return 0;        // dp        int n = s.length();        int[] dp = IntStream.range(0, n).toArray(); // initial value: dp[i] = i        for (int mid = 1; mid < n; mid++) {     // iterate through all chars as mid point of palindrome            // CASE 1. odd len, center is at index mid, expand on both sides            for (int start = mid, end = mid; start >= 0 && end < n && s.charAt(start) == s.charAt(end);                 start--, end++) {                int newCutAtEnd = (start == 0) ? 0 : dp[start - 1] + 1;                dp[end] = Math.min(dp[end], newCutAtEnd);            }            // CASE 2: even len, center is between [mid-1, mid], expand on both sides            for (int start = mid - 1, end = mid; start >= 0 && end < n && s.charAt(start) == s.charAt(end);                 start--, end++) {                int newCutAtEnd = (start == 0) ? 0 : dp[start - 1] + 1;                dp[end] = Math.min(dp[end], newCutAtEnd);            }        }        return dp[n - 1];    }}

3、复杂度分析
时间复杂度: O(n^2)
空间复杂度: O(n)

免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部