使用 Python 檢查字元頻率是否在雷卡曼數列中
假設我們有一個小寫字串 s。我們必須檢查 s 中字母的出現次數,在以任何可能的方式重新排列後,是否生成雷卡曼數列(忽略第一項)。
雷卡曼數列如下所示:
$$a_{n}=\begin{cases}\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:0(如果\:n=0) & \a_{n-1}-n(如果\:a_{n}-n>0\wedge 不存在於數列中) & \\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:a_{n-1}+n(否則)\end{cases}$$
雷卡曼數列的一些項為 [0, 1, 3, 6, 2, 7, 13, 20, 12, 21, 11, 22, 10, 23, 9, 24,...](第一項被忽略,因為它是 0)
因此,如果輸入類似於 s = "pppuvuuqquuu",則輸出將為 True,因為字元和頻率為 (p, 3)、(u, 6)、(v, 1) 和 (q, 2)。因此,頻率形成了雷卡曼數列的前幾項 [1, 3, 6, 2]。
為了解決這個問題,我們將遵循以下步驟:
- freq := 一個儲存 s 中所有字元及其頻率的對映
- n := freq 的大小
- array := 前 n 個雷卡曼數列項
- f := 1
- 對於 freq 中的每個字元,執行以下操作:
- is_found := 0
- 對於範圍從 1 到 n 的 j,執行以下操作:
- 如果 freq[keys] 與 array[j] 相同,則:
- is_found := 1
- 退出迴圈
- 如果 freq[keys] 與 array[j] 相同,則:
- 如果 is_found 為假,則:
- f := 0
- 退出迴圈
- 如果 f 設定為 True,則返回 True,否則返回 False
示例
讓我們檢視以下實現以獲得更好的理解:
from collections import defaultdict def recaman(array, n) : array[0] = 0 for i in range(1, n + 1): temp = array[i - 1] - i for j in range(i): if array[j] == temp or temp < 0: temp = array[i - 1] + i break array[i] = temp def solve(s) : freq = defaultdict(int) for i in range(len(s)) : freq[s[i]] += 1 n = len(freq) array = [0] * (n + 1) recaman(array, n) f = 1 for keys in freq.keys() : is_found = 0 for j in range(1, n + 1) : if freq[keys] == array[j]: is_found = 1 break; if not is_found: f = 0 break return True if f else False s = "pppuvuuqquuu" print(solve(s))
輸入
"pppuvuuqquuu"
輸出
True
廣告
資料結構
網路
關係型資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP