有哪些做留学资讯的网站,做网站工单,小程序开发免费平台,品牌打造给定一个字符串 s#xff0c;将 s 分割成一些子串#xff0c;使每个子串都是回文串。
返回符合要求的最少分割次数。
示例:
输入: aab 输出: 1 解释: 进行一次分割就可将 s 分割成 [aa,b] 这样两个回文子串。
思路#xff1a;dp[i]…给定一个字符串 s将 s 分割成一些子串使每个子串都是回文串。
返回符合要求的最少分割次数。
示例:
输入: aab 输出: 1 解释: 进行一次分割就可将 s 分割成 [aa,b] 这样两个回文子串。
思路dp[i]代表前i个分割最小数如果本身就是回文那么dp[i]0否则它可以和任意比i小的起点组成字符串某个字符串如果是回文它的起点记为j那么dp[i]就可能等于dp[j] 1也就是到为止的最优解加上刚发现的回文串。而最优解就是这些答案中最小的dp[i] Math.min(dp[i], dp[j] 1);。
当然检查是否是回文串是很耗时的可以用马拉车来预先算出这里懒得找了。
public class Solution {public int minCut(String s) {int len s.length();if (len 2) return 0;int[] dp new int[len];for (int i 0; i len; i) dp[i] i;for (int i 1; i len; i) {if (checkPalindrome(s, 0, i)) {dp[i] 0;}else{for (int j 0; j i; j)if (checkPalindrome(s, j 1, i))dp[i] Math.min(dp[i], dp[j] 1);}}return dp[len - 1];}private boolean checkPalindrome(String s, int left, int right) {while (left right) {if (s.charAt(left) ! s.charAt(right)) return false;left;right--;}return true;}
}