题意:给定一个字符串 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;//好习惯
}
原文:https://www.cnblogs.com/jbc666/p/10936544.html