1 条题解

  • 0
    @ 2026-1-30 14:43:54
    #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
    上传者