给定一个字符串s,将s分割成一些子串,使每个子串都是回文串。
返回符合要求的最少分割次数。
输入格式
一行为字符串,长度小于5000。
输出格式
一个数表示答案。
样例
input
aab
output
1
input
aaaa
output
0
思路:
和之前做过的统计单词题目类似(见博客),用dp[i]表示下标0-i的串中需要划分的次数。从位置i开始回推长度从1到j的子串是否是回文串。
#include <algorithm>
#include <iostream>
#include <string>
using namespace std;
int dp[5001];
bool par(string s) {
string s1 = s;
reverse(s.begin(), s.end());
return s1 == s;
}
int main() {
string s;
cin >> s;
//字串0-i:dp[i]
for (int i = 0; i < s.length(); i++) {
dp[i] = par(s.substr(0, i + 1)) ? 0 : i;
if (dp[i] == 0)
continue;
for (int j = 1; j <= i; j++) {
//长度为j的子串
if (par(s.substr(j, i - j + 1))) {
dp[i] = min(dp[i], dp[j - 1] + 1);
} else {
dp[i] = min(dp[i], dp[j - 1] + i - j + 1);
}
}
}
cout << dp[s.length() - 1];
}