2012-10-18 34 views
1

我正在嘗試編寫一個算法,按頻率和字母順序重新排列字符串中的字母。例如,「蘋果」變成「aelpp」。 「香蕉」變成「bnnaaa」。我應該如何按頻率順序排列字母?

我知道不同的語言,但我使用Python現在的代碼了。這是迄今爲止我所擁有的,但它不起作用,因爲沒有頻率排序。

def order(word): 
    word = word.lower() 
    storage = [0] * 26 
    for c in word: 
    storage[ord(c) - 97] += 1 
    newWord = [] 
    for l, c in enumerate(storage): 
    for i in range(0, storage[l]): 
     newWord.append(chr(l + 97)) 
    return ''.join(newWord) 

有關如何最有效地正確實施此算法的任何建議?

回答

2

下面是如何處理在Python這個問題(大部分)Python的例子, 我希望評論是不足以解釋發生了什麼:

words = ["apples", "banannas", "oranges"] 

def main(): 
    # our list of jumbled words 
    jumbled = [] 
    for word in words: 
     # dictionary of letter/frequency pairs. 
     letters = {}; 
     # get letter frequency 
     for letter in word: 
      if letter in letters: 
       letters[letter] += 1 
      else: 
       letters[letter] = 1 
     # sort the letter/frequency pairs on descending frequency 
     jumbled_word = sorted(letters.items(), key = lambda x: x[1], 
                   reverse = True) 
     # join the letters back together and add to our jumbled words 
     jumbled.append(''.join([x[0] for x in jumbled_word])) 
     letters = {} 

    # print out the jumbled words in alphabetical order 
    for x in sorted(jumbled): 
     print x 

if __name__=="__main__": 
    main() 

此實現將保持大寫字母大寫。

1

對於頻率使用共同的工具是一個哈希表(字典在python)。我不是蟒蛇非常有信心,所以我會給你一些僞代碼

hashtable table 
for character in string 
    table[character] +=1; 
list partiallySorted = alphabetize(table.keys()) 
list sortedList = stablesort partiallySorted by (table[a]<table[b] iff a<b) 

穩定的排序將保持相等的元素從而保護您的訂單之間的相對順序。

幸運的是,因爲Python 2.2種種保證穩定的,因此您可以調用庫的排序函數來進行排序穩定,如果你不希望自己實現它。