1 题目描述
给出一个字符串s,分割s使得分割出的每一个子串都是回文串 计算将字符串s分割成回文分割结果的最小切割数 例如:给定字符串s=“aab”, 返回1,因为回文分割结果[“aa”,“b”]是切割一次生成的。
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. For example, given s =“aab”, Return1since the palindrome partitioning[“aa”,“b”]could be produced using 1 cut.
示例1
输入
“aab”
输出
1
2 解题思路
动态规划,
d
p
[
i
]
[
j
]
dp[i][j]
dp[i][j]代表源字符串第
i
i
i个字母到第
j
j
j个字母(包含
j
j
j)的子字符串的最小切割数。
3 代码实现
class Solution {
public:
int minCut(string s
) {
int n
= s
.size();
if(isPalindrome(s
, 0, n
- 1)) return 0;
vector
<vector
<int>> dp(n
, vector
<int>(n
, 0X7FFFFFFF));
for(int i
= 0; i
< n
; i
++)
dp
[i
][i
] = 0;
for(int rightSubLeft
= 1; rightSubLeft
< n
; rightSubLeft
++)
for(int left
= 0, right
= left
+ rightSubLeft
; right
< n
; left
++, right
++){
if(isPalindrome(s
, left
, right
)){
dp
[left
][right
] = 0;
continue;
}
for(int mid
= left
; mid
< right
; mid
++)
dp
[left
][right
] = min(dp
[left
][right
], dp
[left
][mid
] + dp
[mid
+ 1][right
] + 1);
}
return dp
[0][n
- 1];
}
bool isPalindrome(string
&s
, int left
, int right
){
while(left
< right
)
if(s
[left
] == s
[right
]){
left
++;
right
--;
}
else
return false;
return true;
}
};
4 运行结果
运行时间:24ms 占用内存:1368k