/*
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;
}