字符串的完美度


還是龐果網,又看到一個題目,這個比較簡單。


題目詳情

我們要給每個字母配一個1-26之間的整數,具體怎麼分配由你決定,但不同字母的完美度不同,

而一個字符串的完美度等於它裏面所有字母的完美度之和,且不在乎字母大小寫,也就是說字母F和f的完美度是一樣的。


現在給定一個字符串,輸出它的最大可能的完美度。

例如:dad,你可以將26分配給d,25分配給a,這樣整個字符串最大可能的完美度爲77。


函數頭部

C

int perfect(const char *s);

C++

int perfect(const string &s);

java

public static int perfect(String s);


算法描述


算法沒什麼可說的,比較簡單,先把字符串都變成大寫或者小寫,然後依次找出出現次數最多的字母,然後最多的分26,次多的分25,依次類推,最後求和,算法難度一顆星。。。。


#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <vector>
#include <iostream>

using namespace std;


struct myclass {
  bool operator() (int i,int j) { return (i>j);}
} myobject;

int howMany(string &str)
{
    if(str.size()==1)
    {
        str.erase(0,1);
        return 1;
    }

    
    if(str.size()==0)
        return 0;
    
    string::iterator it;
    char  cmp=str[0];
    int count=0;
    
    for(int i=0;i<str.size();i++)
    {
        if(cmp==str[i])
        {
            count++;
            str.erase(i,1);
            i--;
        }
    }
    
    return count;
}

int perfect(const string &s) {
    string str=s;
    vector<int> charCounts;
    int count,i,j;
    int perfectNum=0;
    
    transform(str.begin(), str.end(), str.begin(), ::toupper);
    
    do
    {
        count=howMany(str);
        charCounts.push_back(count);
    }while(count>0);
    
    sort(charCounts.begin(),charCounts.end(),myobject);
    
    for(i=0,j=26;i<charCounts.size();i++,j--)
    {
        perfectNum=perfectNum+j*charCounts[i];
        //cout << charCounts[i] << " --- ";
    }
        
    
    //cout << endl;
    //cout << "perfect Num is " << perfectNum << endl;
    return perfectNum;
}


//start 提示:自動閱卷起始唯一標識,請勿刪除或增加。
int main()
{   
    cout << perfect("DAddfdafdfhjfaodnDFESSDF") << endl;
} 
//end //提示:自動閱卷結束唯一標識,請勿刪除或增加。



發佈了54 篇原創文章 · 獲贊 16 · 訪問量 47萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章