解题思路

  1. 对于每个字符串,统计每个字母出现的次数
  2. 将字母出现次数按从大到小排序
  3. 贪心策略:将最大的次数分配最大的漂亮度(26),次大的分配次大的漂亮度(25),以此类推
  4. 计算总的漂亮度值

代码

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

int getBeauty(string& name) {
    vector<int> count(26, 0);  // 统计26个字母出现次数
    
    // 统计每个字母出现的次数
    for(char c : name) {
        count[tolower(c) - 'a']++;
    }
    
    // 将出现次数从大到小排序
    sort(count.begin(), count.end(), greater<int>());
    
    // 计算漂亮度
    int beauty = 0;
    int value = 26;  // 最大漂亮度从26开始
    for(int i = 0; i < 26 && count[i] > 0; i++) {
        beauty += count[i] * value--;
    }
    
    return beauty;
}

int main() {
    int n;
    cin >> n;
    
    while(n--) {
        string name;
        cin >> name;
        cout << getBeauty(name) << endl;
    }
    
    return 0;
}
import java.util.*;

public class Main {
    public static int getBeauty(String name) {
        int[] count = new int[26];
        
        // 统计每个字母出现的次数
        for(char c : name.toLowerCase().toCharArray()) {
            count[c - 'a']++;
        }
        
        // 将出现次数从大到小排序
        Arrays.sort(count);
        
        // 计算漂亮度
        int beauty = 0;
        int value = 26;
        for(int i = 25; i >= 0 && count[i] > 0; i--) {
            beauty += count[i] * value--;
        }
        
        return beauty;
    }
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        
        while(n-- > 0) {
            String name = sc.next();
            System.out.println(getBeauty(name));
        }
    }
}
def get_beauty(name):
    # 统计每个字母出现的次数
    count = {}
    for c in name.lower():
        count[c] = count.get(c, 0) + 1
    
    # 将出现次数从大到小排序
    freq = sorted(count.values(), reverse=True)
    
    # 计算漂亮度
    beauty = 0
    value = 26
    for f in freq:
        beauty += f * value
        value -= 1
    
    return beauty

n = int(input())
for _ in range(n):
    name = input().strip()
    print(get_beauty(name))

算法及复杂度

  • 算法:贪心算法
  • 时间复杂度:,其中 是字符串长度, 是不同字符的数量(最大为26)
  • 空间复杂度:,需要存储每个字符的出现次数(最大为26)