NC21650. 牛牛与回文串
描述
输入描述
输入一个字符串S,1 ≤ |s| ≤ 1000
输出描述
第一行输出一个整数K,表示回文串的个数
接下来K行每行输出一个回文串,要求输出的所有字符串的字符集合恰好是输入的S中的所有字符集合
示例1
输入:
abbaa
输出:
1 ababa
示例2
输入:
abc
输出:
3 a b c
示例3
输入:
aaabbbccc
输出:
3 aba bcb cac
示例4
输入:
z
输出:
1 z
Python3 解法, 执行用时: 43ms, 内存消耗: 6812K, 提交时间: 2023-08-06 18:14:30
def main(): stro = input(); digi_dict = {}; ordlist = []; for digi in stro: digi_dict[digi] = digi_dict.get(digi,0) + 1; for digi in digi_dict.keys(): if(digi_dict[digi]%2==1): ordlist.append(digi); digi_dict[digi] -= 1; if(len(ordlist)<=1): print(1); else: print(len(ordlist)); mainstr = ''; keylist = list(digi_dict.keys()); M = len(digi_dict.keys()); for i in range(M): mainstr += keylist[i]*(digi_dict[keylist[i]]//2); if(ordlist): mainstr += ordlist.pop(); for i in range(M): mainstr += keylist[-i-1]*(digi_dict[keylist[-i-1]]//2); print(mainstr); for digi in ordlist: print(digi); return; main();
C++ 解法, 执行用时: 4ms, 内存消耗: 460K, 提交时间: 2021-12-01 18:57:57
#include<bits/stdc++.h> using namespace std; const int N=1e3+100; char s[N]; int ans,num[N],a[N]; int main() { scanf("%s",s); int n=strlen(s); for(int i=0;i<n;i++) num[(s[i]-'a'+1)]++; for(int i=1;i<=26;i++) { if(num[i]%2) { ans+=1; a[ans]=i; } } printf("%d\n",max(ans,1)); for(int i=1;i<=26;i++) { int w=num[i]/2; for(int j=1;j<=w;j++) printf("%c",(i-1)+'a'); } if(ans) printf("%c",a[1]-1+'a'); for(int i=26;i>=1;i--) { int w=num[i]/2; for(int j=1;j<=w;j++) printf("%c",(i-1)+'a'); } printf("\n"); for(int i=2;i<=ans;i++) printf("%c\n",a[i]-1+'a'); return 0; }