首页 > 其他 > 详细

题解 AT1877 【回文分割】

时间:2019-05-28 13:23:22      阅读:140      评论:0      收藏:0      [点我收藏+]

题意:给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。 返回 s 所有可能的分割方案。

示例:

输入:aab

输出:3

解释:aba

思路:

记录字符串中每个字符出现的次数si

如果si为偶数,那么这些字符i就可以和别的回文串拼在一起变成更长的回文串

如果si为奇数,那就必须从i中拿一个出来作为某个回文串的中间字符

容易发现,si中有多少个为奇数,最少就可以分成几个串

知道最少可以分成几个串以后枚举长度即可

可得以下AC代码:

#include<bits/stdc++.h>
using namespace std;
int a[30],p,i;
int main(){
    string s;
    cin>>s;//输入
    int l=s.size();//求串长
    for(i=0;i<l;i++)a[s[i]-‘a‘]++;//拼起来
    for(i=0;i<26;i++)p+=a[i]%2;
    if(!p){//特判p=0
        cout<<l;
        return 0;//退出很重要,否则会输出其他东西
    }
    for(i=1;p*i<=l;i+=2);//枚举长度
    cout<<i-2;//输出
    return 0;//好习惯
}

题解 AT1877 【回文分割】

原文:https://www.cnblogs.com/jbc666/p/10936544.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!