每天两道LeetCodeHard:(22)

122 阅读1分钟

132. Palindrome Partitioning II

回文串系列最难的题

题干:

Given a string s, partition s such that every substring of the partition is a palindrome.
Return the minimum cuts needed for a palindrome partitioning of s.

解释:

让我们切割一个字符串,使得每个部分都是回文串,返回切割的最小次数

思考:

字符串,极值,肯定是用dp。但是回文类的题用dp很难做,因为不好判断递推关系式。这个题答案用了一种非常非常巧妙的办法,中心扩展法,也就是说最小切割次数,其实就是让每个回文串尽可能的延伸,这样它覆盖的位置只需一次切割,然后在这个延伸的过程中寻找可以延伸的范围内的最小值dp[i],用dpi来更新dpj即可,ij之间的字符串都只需一次切割。时间效率100%

答案:

class Solution {
    public int minCut(String s) {
        if(s == null || s.length() <= 1)
            return 0;
        int len = s.length();
        int dp[] = new int[len];
        Arrays.fill(dp, len-1);
        for(int i = 0; i < len; i++){
            // 注意偶数长度与奇数长度回文串的特点
            mincutHelper(s , i , i , dp);  // 奇数回文串以1个字符为中心
            mincutHelper(s, i , i+1 , dp); // 偶数回文串以2个字符为中心
        }
        return dp[len-1];
    }
    private void mincutHelper(String s, int i, int j, int[] dp){
        int len = s.length();
        while(i >= 0 && j < len && s.charAt(i) == s.charAt(j)){
            dp[j] = Math.min(dp[j] , (i==0?-1:dp[i-1])+1);
            i--;
            j++;
        }
    }
}

答案补充: