测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A39810. 切割回文

填空题 较难

题目描述

切割回文

题目描述

阿福最近对回文串产生了非常浓厚的兴趣。

如果一个字符串从左往右看和从右往左看完全相同的话,那么就认为这个串是一个回文串。例如,“abcaacba”是一个回文串,“abcaaba”则不是一个回文串。

阿福现在强迫症发作,看到什么字符串都想要把它变成回文的。阿福可以通过切割字符串,使得切割完之后得到的子串都是回文的。

现在阿福想知道他最少切割多少次就可以达到目的。例如,对于字符串“abaacca”,最少切割一次,就可以得到“aba”和“acca”这两个回文子串。

输入

输入的第一行是一个整数 T (T <= 20) ,表示一共有 T 组数据。

接下来的 T 行,每一行都包含了一个长度不超过的 1000 的字符串,且字符串只包含了小写字母。

输出

对于每组数据,输出一行。该行包含一个整数,表示阿福最少切割的次数,使得切割完得到的子串都是回文的。

样例输入

3

abaacca

abcd

abcba

样例输出

1

3

0

参考答案

​ #include <bits/stdc++.h> using namespace std; const int MAXN = 1010; int dp[MAXN][MAXN]; int main() { int t; string s; cin >> t; while(t--) { memset(dp,0,sizeof(dp)); cin >> s; int len = s.length(),cnt = 0; for (int i = len-1; i >= 0; i--) { dp[i][i] = 1; for (int j = i+1; j < len; j++) { //判断i 到 j 是否回文 if(s[i] == s[j]) { if(j - i <= 1) dp[i][j] = 1; else dp[i][j] = dp[i+1][j-1]; } else dp[i][j] = 0; } } for (int i = 0;i < len; i++) { int j; for (j = len-1; j >= i; j--) { if(dp[i][j]) break; } i = j; if(i == len-1) break; cnt++; } cout << cnt <<"\n"; } return 0; }
上一题 下一题