编程挑战(7)
/*
1: 问题的提出:
我们要给每个字母配一个1-26之间的整数,具体怎么分配由你决定,但不同字母的完美度不同,
而一个字符串的完美度等于它里面所有字母的完美度之和,且不在乎字母大小写,也就是说字母F和f的完美度是一样的。
现在给定一个字符串,输出它的最大可能的完美度。
例如:dad,你可以将26分配给d,25分配给a,这样整个字符串最大可能的完美度为77.
2:问题的转化:
要得到一个字符串最大的完美度,肯定要给出现频率最大字符分配的完美度最大,从26开始以此来分配
*/
#include "stdafx.h" #include <string> #include <set> #include <iostream> using namespace std; //判断一个字符是否在 'a'--'z', or 'A'--'Z' bool legalch(char ch) { bool legal = false; if ((ch >='a' && ch <= 'z') || (ch >='A' && ch <= 'Z')) { legal = true; } return legal; } //把一个字符转化为小写 char lowerchar(char ch) { if(ch >='A' && ch <= 'Z') { return ch + 'a' - 'A'; } else { return ch; } } //把一个字符串全部转换为小写 bool lowerstring(string & str) { bool result = true; for(unsigned int i = 0; i < str.length(); i++) { if (legalch(str.at(i)) && lowerchar(str.at(i))) { str.replace(i, 1, 1, lowerchar(str.at(i))); } else { result = false; break; } } return result; } //求一个字符串的perfect 值,如果字符串包含非26个英文字母的大小写,则返回0 int perfect(string &str) { int value = 0; char result[26]; memset(result, 0, 26); if (lowerstring(str)) { for(unsigned int i = 0; i < str.length(); i++) { result[str.at(i) - 'a']++; } //更换存储结构 typedef struct record { char ch; int count; int perfect; }RECORD; RECORD rec[26]; int number = 0; for(int i=0; i<26; i++) { if (result[i] != 0) { rec[number].ch = i + 'a'; rec[number].count = result[i]; rec[number].perfect = 0; number++; } } //排序 for(int i=0; i<number; i++) { for(int j=i; j<number; j++) { if (rec[i].count < rec[j].count) { RECORD temp = rec[i]; rec[i] = rec[j]; rec[j] = temp; } } } for(int i=0; i<number; i++) { rec[i].perfect = 26 - i; value = value + rec[i].count * rec[i].perfect; printf("%c %d %d\n", rec[i].ch, rec[i].count, rec[i].perfect); } } else { cout<<str << " is illegal" <<endl; } return value; } int _tmain(int argc, _TCHAR* argv[]) { string str = "dad"; int pervalue = perfect(str); printf("perfect value=%d\n", pervalue); getchar(); return 0; }