リンク
https://leetcode-cn.com/problems/palindrome-partitioning-ii/
時間がかかる
問題解決:32分
問題解決:25分
題名
文字列sを指定します。各部分文字列が回文になるように、sをいくつかの部分文字列に分割してください。
要件を満たす分割の最小数を返します。
アイデア
dp [i]は、s [0:i]の文字列の最小分割数を表します。
dp [i] = {0(s [0:i]は回文)minj= 0 i − 1(dp [j] + 1)s [j + 1:i]が回文の場合Next(s [ 0:i]は回文文字列ではありません)dp [i] = \ begin {cases} 0 \ \ \ \ \ \ \ \ \ \(s [0:i]は回文文字列です)\\ \ min_ {j = 0} ^ {i-1}(dp [j] +1)s [j + 1:i]が回文の場合\ \(s [0:i]は回文ではありません)\ end {cases} d p [ i ]={{ 0 (s [ 0 :I ]リターンテキスト文字列)分j = 0I - 1(d p [ j ]+1 )in s (j+1:I ]リターンテキスト文字列がある場合の条件の下で(S [ 0 :I ]ではありませんへの復帰のテキスト文字列)
回文文字列を判断します。is_palindrome[i] [j]は、s [i:j]が回文文字列であるかどうかを示します。
is _ palindrome [i] [j] = {true、i≥jis_palindrome [i + 1] [j −1]∧s[i] = = s [j]、それ以外の場合はis \ _palindrome [i] [j] = \ begin {cases} true、i \ geq j \\ is \ _palindrome [i + 1] [j-1] \ wedge s [i] == s [j]、それ以外の場合は\ end {cases} i s _ p a l i n d r o m e [ i ] [ j ]={{ t r u e 、私≥ji s _ p a l i n d r o m e [ i+1 ] [ j−1 ]∧s [ i ]= =s [ j ] 、O T H E R W I S E
時間計算量:O(n 2)O(n ^ 2)O (n2)
ACコード
class Solution {
public:
int minCut(string s) {
int n = s.size();
vector<vector<bool>> is_palindrome(n, vector<bool>(n, true));
for(int i = n-1; i >= 0; --i) {
for(int j = i+1; j < n; ++j) {
is_palindrome[i][j] = (is_palindrome[i+1][j-1] && s[i] == s[j]);
}
}
vector<int> dp(n, n-1);
dp[0] = 0;
for(int i = 1; i < n; ++i) {
if(is_palindrome[0][i]) {
dp[i] = 0;
}
else {
for(int j = 0; j < i; ++j) {
if(is_palindrome[j+1][i]) {
dp[i] = min(dp[i], dp[j]+1);
}
}
}
}
return dp[n-1];
}
};