标签:Partitioning Palindrome end mid II start && newCutAtEnd dp
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)
标签:Partitioning,Palindrome,end,mid,II,start,&&,newCutAtEnd,dp 来源: https://www.cnblogs.com/junstat/p/16287184.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。