完美字符串

约翰认为字符串的完美度等于它里面所有字母的完美度之和。每个字母的完美度可以由你来分配,不同字母的完美度不同,分别对应一个1-26之间的整数。
约翰不在乎字母大小写。(也就是说字母F和f)的完美度相同。给定一个字符串,输出它的最大可能的完美度。例如:dad,你可以将26分配给d,25分配给a,这样整个字符串完美度为77。
Input
输入一个字符串S(S的长度 <= 10000),S中没有除字母外的其他字符。
Output
由你将1-26分配给不同的字母,使得字符串S的完美度最大,输出这个完美度。
Sample Input
dad
Sample Output
77

分析:就是统计出字符串出现的次数多的字符,然后分配给它最大的完美度,就是贪心吧,思路很简单,看代码吧

 

import java.util.*;  
public class Main {  
    static Scanner in = new Scanner(System.in);  
    static int maxn = 10005;
    static int[] bool = new int[30]; 
    static int[] a = new int[30];
    static int[] f = {26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1};
    public static void main(String[] args) {
    	Arrays.fill(bool, 0);
    	String s = in.next().toLowerCase();
    	long sum = 0;   
    	int k =0,p =0;
    	for(int i = 0;i < s.length();i++)
    		bool[s.charAt(i)-96]++;//统计每个字符出现次数
    	for(int i = 1;i < 27;i++) {
    		if(bool[i]!=0)
    			a[k++] = bool[i];//中间数组,用来将次数排序
    	}
    	Arrays.sort(a,0,k);
    	for(int i = k-1 ; i >= 0;i--)
    		sum += a[i]*f[p++];//贪心,次数大的分配大的因子
    	System.out.println(sum);
    }  
}
思考:注意处理方式

 

 

 

你可能感兴趣的:(动态规划贪心)