Palindrome Partitioning II 數組
Given a string s, partition s such that every substring of the partition is a palindrome.spa
Return the minimum cuts needed for a palindrome partitioning of s.code
For example, given s = "aab"
,
Return 1
since the palindrome partitioning ["aa","b"]
could be produced using 1 cut.blog
從後往前構造二維數組isPalin,用於存儲已經肯定的迴文子串。isPalin[i][j]==true表明s[i,...,j]是迴文串。string
在構造isPalin的同時使用動態規劃計算從後往前的最小切分數,記錄在min數組中。min[i]表明s[i,...,n-1]的最小切分數。it
(上述兩步分開作會使得代價翻倍,容易TLE)io
關鍵步驟:class
一、min[i]初始化爲min[i+1]+1,即初始化s[i]與s[i+1]之間須要切一刀。這裏考慮邊界問題,所以min數組設爲n+1長度。im
二、從i到n-1中間若是存在位置j,同時知足:(1)s[i,...,j]爲迴文串;(2)1+min[j+1] < min[i]。二維數組
那麼min[i]=1+min[j+1],也就是說一刀切在j的後面比切在i的後面要好。
class Solution { public: int minCut(string s) { int n = s.size(); vector<vector<bool> > isPalin(n, vector<bool>(n, false)); vector<int> min(n+1, -1); //min cut from end for(int i = 0; i < n; i ++) { isPalin[i][i] = true; } for(int i = n-1; i >= 0; i --) { min[i] = min[i+1] + 1; for(int j = i+1; j < n; j ++) { if(s[i] == s[j]) { if(j == i+1 || isPalin[i+1][j-1] == true) { isPalin[i][j] = true; if(j == n-1) min[i] = 0; else if(min[i] > min[j+1]+1) min[i] = min[j+1] + 1; } } } } return min[0]; } };