題目描述
給定一個字符串s,s包括以空格分隔的若干個單詞,請對s進行如下處理后輸出:
1、單詞內部調整:對每個單詞字母重新按字典序排序
2、單詞間順序調整:
1)統計每個單詞出現的次數,并按次數降序排列
2)次數相同,按單詞長度升序排列
3)次數和單詞長度均相同,按字典升序排列
請輸出處理后的字符串,每個單詞以一個空格分隔。
輸入描述
一行字符串,每個字符取值范圍:[a-zA-z0-9]以及空格,字符串長度范圍:[1,1000]
輸出描述
輸出處理后的字符串,每個單詞以一個空格分隔。
用例
輸入 | This is an apple |
輸出 | an is This aelpp |
說明 | 無 |
輸入 | My sister is in the house not in the yard |
輸出 | in in eht eht My is not adry ehosu eirsst |
說明 | 無 |
單詞處理與排序算法詳解
核心解題思路
本題需要對字符串中的單詞進行雙重處理:單詞內部字符排序和單詞間多重排序。解題關鍵在于:
- 單詞內部處理:對每個單詞的字符重新按字典序排序
- 單詞間排序:按照三重規則排序
- 規則1:按單詞出現頻率降序排列
- 規則2:頻率相同則按單詞長度升序排列
- 規則3:長度相同則按字典序升序排列
處理流程
- 分割字符串:將輸入字符串按空格分割成單詞列表
- 單詞內部排序:對每個單詞的字符進行字典序排序
- 統計頻率:計算每個處理后的單詞出現次數
- 多重排序:按照三重規則對單詞列表排序
- 結果拼接:將排序后的單詞用空格連接
完整代碼實現
def process_string(s):# 1. 分割字符串為單詞列表words = s.split()# 2. 對每個單詞內部字符排序sorted_words = []for word in words:# 將單詞轉為字符列表排序后重新組合sorted_word = ''.join(sorted(word))sorted_words.append(sorted_word)# 3. 統計處理后的單詞頻率from collections import Counterword_freq = Counter(sorted_words)# 4. 多重排序:頻率降序 > 長度升序 > 字典序升序# 使用元組作為排序鍵:(-頻率, 長度, 單詞)sorted_list = sorted(sorted_words,key=lambda word: (-word_freq[word], len(word), word))# 5. 拼接最終結果return ' '.join(sorted_list)# 主程序
if __name__ == "__main__":input_str = input().strip()output = process_string(input_str)print(output)
算法原理解析
1. 單詞內部排序
sorted_word = ''.join(sorted(word))
sorted(word)
:將單詞拆分為字符列表并按ASCII值排序''.join()
:將排序后的字符重新組合為字符串- 示例:
- “apple” → [‘a’,‘p’,‘p’,‘l’,‘e’] → 排序為[‘a’,‘e’,‘l’,‘p’,‘p’] → “aelpp”
- “This” → [‘T’,‘h’,‘i’,‘s’] → 排序為[‘T’,‘h’,‘i’,‘s’] → “This” (已有序)
2. 頻率統計
from collections import Counter
word_freq = Counter(sorted_words)
Counter
類高效統計單詞出現次數- 返回字典:{單詞: 出現次數}
- 示例:對于輸入[“in”, “eht”, “in”] → 頻率統計為{‘in’:2, ‘eht’:1}
3. 多重排序
key=lambda word: (-word_freq[word], len(word), word)
- 第一關鍵字:
-word_freq[word]
- 負號實現降序效果(頻率越高,負值越小)
- 示例:頻率2變為-2,頻率1變為-1,-2 < -1 → 頻率2排在前面
- 第二關鍵字:
len(word)
- 按單詞長度升序排列
- 長度短的單詞排在前面
- 第三關鍵字:
word
- 按字典序升序排列
- 字典序小的單詞排在前面(按字符ASCII值比較)
示例解析
示例1:輸入"This is an apple"
-
單詞內部排序:
- “This” → “This”(字符已有序)
- “is” → “is”
- “an” → “an”
- “apple” → “aelpp”
-
頻率統計:
- 所有單詞出現1次
-
多重排序:
- 頻率相同 → 比較長度
- 長度:“an”(2)、“is”(2) < “This”(4) < “aelpp”(5)
- "an"和"is"長度相同 → 比較字典序:“an” < “is”(‘a’(97) < ‘i’(105))
-
最終排序:
- [“an”, “is”, “This”, “aelpp”]
- 輸出:“an is This aelpp”
示例2:輸入"My sister is in the house not in the yard"
-
單詞內部排序:
- “My” → “My”
- “sister” → “eirsst”
- “is” → “is”
- “in” → “in”(兩次)
- “the” → “eht”(兩次)
- “house” → “ehosu”
- “not” → “not”
- “yard” → “adry”
-
頻率統計:
- “in”:2, “eht”:2, 其他單詞:1
-
多重排序:
- 頻率降序:"in"和"eht"優先(頻率2 > 1)
- 長度升序:
- “in”(2) < “eht”(3)(長度短的在前)
- 其他單詞:(“My”:2, “is”:2) < “not”:3 < “adry”:4 < “ehosu”:5 < “eirsst”:6
- 字典序升序:
- "in"和"eht"內部相同
- “My” < “is”(‘M’(77) < ‘i’(105))
-
最終排序:
- [“in”,“in”,“eht”,“eht”,“My”,“is”,“not”,“adry”,“ehosu”,“eirsst”]
- 輸出:“in in eht eht My is not adry ehosu eirsst”
總結
實際應用
- 文本分析:詞頻統計與排序
- 數據清洗:統一單詞格式
- 搜索引擎:搜索結果排序
- 自然語言處理:詞匯規范化
- 日志分析:高頻事件識別
通過這個解法,初學者可以掌握:
- 字符串操作的核心技巧
- 多重排序的實現方法
- 頻率統計的高效方式
- 復雜問題的分解思路
- Python內置函數的靈活應用
這種"分治+排序"的方法是處理字符串排序問題的通用模式,理解后可以擴展到更復雜的文本處理場景中。