1 条题解
-
0
#include<bits/stdc++.h> using namespace std; // [1] arr统计小写字母a-z出现次数(a对应1,z对应26),brr统计大写字母A-Z出现次数(A对应1,Z对应26),数组初始化为0 int arr[30]={}; int brr[30]={}; int main() { string s; cin>>s; int n=s.size(); // [2] n记录输入字符串的总长度 // [3] 遍历字符串,大小写敏感分别统计字母出现次数,存入对应数组 for(int i=0;i<n;i++){ // 小写字母,映射到arr[1-26]并计数 if(s[i]>='a' && s[i]<='z'){ arr[s[i]-'a'+1]++; } // 大写字母,映射到brr[1-26]并计数(大小写视为不同字符) if(s[i]>='A' && s[i]<='Z'){ brr[s[i]-'A'+1]++; } } // [4] sum_o:所有可用于构成回文的偶数次字符总数;sum_j:奇数次出现的字母总个数 int sum_o=0,sum_j=0; // [5] 遍历处理小写字母统计结果,计算有效回文字符数 for(int i=1;i<=26;i++){ if(arr[i]==0) continue; // 跳过未出现的小写字母 if(arr[i]%2==0){ sum_o+=arr[i]; // 偶数次字母,全部计入有效数 }else{ sum_o+=arr[i]/2*2; // 奇数次字母,取最大偶数部分计入有效数 sum_j+=arr[i]%2; // 记录奇数次数(余数恒为1) } } // [6] 遍历处理大写字母统计结果,计算有效回文字符数(逻辑同小写) for(int i=1;i<=26;i++){ if(brr[i]==0) continue; // 跳过未出现的大写字母 if(brr[i]%2==0){ sum_o+=brr[i]; // 偶数次字母,全部计入有效数 }else{ sum_o+=brr[i]/2*2; // 奇数次字母,取最大偶数部分计入有效数 sum_j+=brr[i]%2; // 记录奇数次数(余数恒为1) } } // [7] 计算并输出最长回文串长度:有效偶数数 + 回文中心(有奇数则加1,无则加0) cout<<sum_o+min(1,sum_j); return 0; }
- 1
信息
- ID
- 1207
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者