ACM复习(27)8633 回文划分

Description
我们说一个字符串是回文串,那么意味着这个串从两边读起来的字母都是一样的。例如racecar是回文串,
然而fastcar则不是。
对一个串的划分意思是将一个串划分为若干个部分。例如,racecar可以划分为race 和car两部分。给出
一个串,要把这个串划分为若干个回文串,那么至少要把这个串划分为多少部分?
例如
‘racecar’已经是回文串,划分为1 个部分即可(这个部分就是racecar)。
‘fastcar’ 需要被划分为七个部分 (‘f’, ‘a’, ‘s’, ‘t’, ‘c’, ‘a’, ‘r’)。根据回文串的定义,单个字母也是回文串。
‘aaadbccb’ 分成可以被分为三个回文串 (‘aaa’, ‘d’, ‘bccb’)。找不到更少的划分方法。

输入格式
输入的第一行是数字T,表示输入文件含有T个CASE。之后有T行,每行有一个长度不大于1000的字
符串,全部由小写字母组成,中间没有空格。

输出格式
对于每个CASE,输出一个数字,表示对该字符串的回文串最小划分。

输入样例
3
racecar
fastcar
aaadbccb

输出样例
1
7
3


解题思路

这里写图片描述

#include<iostream>
using namespace std;
int main()
{
    int t, len, min, j, k, record[1002];
    string s;
    cin >> t;
    while(t --)
    {
        cin >> s;
        len = s.length();
        record[0] = 1;
        for(int i = 1; i < len; i ++)
        {
            min = record[i - 1] + 1;
            // 寻找能构成回文串的 str[q] ~ str[i]
            for(int q = 0; q < i; q ++)
            {
                j = q;
                k = i;
                while(j < k)
                {
                    if(s[j] != s[k])
                        break;
                    j ++;
                    k --;
                }
                if(j >= k)
                {
                    if(q == 0)
                    {
                        min = 1;
                        break;
                    }
                    else
                        min = min <= record[q - 1] + 1 ? min : record[q - 1] + 1;
                }
            }
            record[i] = min;
        }
        printf("%d\n", record[len - 1]);
    }
    return 0;   
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值