假设我们有一个小写的字符串s。我们必须检查以任何可能的方式重新排列后,s中字母的出现是否生成了Recaman序列(忽略第一个术语)。
Recaman的序列如下-
$$a_{n}=\begin{cases}\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:0(if\:n=0) & \\a_{n-1}-n(if\:a_{n}-n>0\wedge not\:present\in sequence) & \\\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:a_{n-1}+n(otherwise)\end{cases}$$
Recaman序列的某些项目是[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)。因此,频率构成了Recaman序列的前几个项[1、3、6、2]。
让我们看下面的实现以更好地理解-
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