经过多次努力,我得到了这个程序,至少在我测试过的几个测试用例中。这是我从CodeWars获得的一个挑战,任务是创建一个程序,它接受一个输入字符串(按顺序,或加扰)并返回一个布尔值,无论该输入是否由重复的子字符串组成。
我的方法是使用itertools.permutations列出可以从给定字符串输入中生成的所有可能的字符串,然后使用正则表达式来匹配它们中的每一个。保证工作,但也指数复杂,导致我的wussy英特尔i5 w / 8gigs输入只有3个唯一字符len()== 12的内存错误。
必须有一种更有效的方式来运行它(在Python中最好,在Pypy / C扩展中执行它不在此分配的范围内)
足够的序言,这是我的代码:
def has_subpattern(string):
'''input: a string. Output: boolean: whether the input str is made of a
smaller repeating substring. '''
import re
from itertools import permutations
if len(string) <= 1:
return False
# check if the input has a repeating subpattern (in case it's not scrambled)
if bool( re.match(r'(.+?)\1+$', string)) == True:
return True
# create a set of the permutation of a string ( to remove duplicates)
perms = set([''.join(p) for p in permutations(string)])
pattern = re.compile(r'(.+?)\1+$')
print('# of permutations: ', len(perms))
print(perms)
# iterate through the list of permutations, checking if any has #subpattern
for perm in perms:
if bool((re.match(pattern, perm))) == True:
print((re.match(pattern, perm)), perm)
return True
return False
string =“123a213a321a” 打印(has_subpattern(字符串))
有关此方法的任何建议,以减少运行时间?我是一个新手,完全不知所措。
答案 0 :(得分:0)
我认为你接近错了。如果它可以加扰,你真的只需要检查每个字符的数量是否相同。在javascript中,你可以这样做:
<input type="radio" ng-model="value" value="foo" ng-change='clearValue()'>
<input type="text" ng-model="name">
&#13;
对于python,只需按照相同的方法 - 计算每个字符出现的次数,看看每个字符是否具有相同的计数。
答案 1 :(得分:0)
dave帖子中反击方法的python是:
from collections import Counter
c = Counter(string)
print(set(c.most_common().values()) == 1)
想法是计算所有字符,然后通过获取计数器中的一组值来检查计数是否完全相同。如果集合中只有一个数字,则所有字符都具有相同的计数,并且是加扰的子字符串。
答案 2 :(得分:0)
在讨论了一些来自论坛的建议之后,我创建了一个使用计数器的解决方案,并且比粗暴强迫所有排列对正则表达式的价格低了几个数量级:
这就是我的意思:
def has_subpattern(string):
''' input: a string, output: boolean, whether the input is composed of a
repeating substring '''
from collections import Counter
c = Counter(string)
if 1 in c.values():
return False
return len(set(c.values())) == 1