正如标题所说,我需要帮助减少代码的执行时间,我已经编写为在线判断我编译它会给我一个时间限制超出错误,即使代码似乎工作和在编译时给出了正确的答案。
问题:
比较一个字符串列表并找到不同字符串的数量,其中两个字符串被认为是"相同的" (并不明显)如果它们完全相同,或相同但反转。字符串仅包含字母a-z,全部为小写,最多包含10个字符。提供的每个集合中最多包含5000个字符串。
例如,字符串" abc"与" cba"相同以及" abc。"字符串" cba"与" abc"相同以及" cba。"清单[" abc," " CBA," " bac"]中有2个不同的字符串。
写一个函数answer(x),它接受一个字符串列表x,并使用相同的定义返回不同字符串的数量。
我的代码:
def answer(x):
b=0
ph=[]
rand=0
for y in x:
comp=list(y)
ph.append(comp)
while b<len(ph)-1:
j=b+1
while j<len(ph):
if(len(ph[b])==len(ph[j])):
i=0
while(i<len(ph[b])):
if ph[b][i]==ph[j][i]:
rand+=1
elif ph[b][i]==ph[j][len(ph[b])-1-i]:
rand+=1
i+=1
if rand==len(ph[b]):
ph.pop(j)
rand=0
j+=1
b+=1
return len(ph)
答案 0 :(得分:2)
不需要进行序列字符比较来检查字符串标识。
字符串在Python中是不可变的。只需将字符串及其反向放入字典中,然后始终检查该字典。
def answer(x):
seen = {}
count = 0
for s in x:
if s not in seen:
seen[s] = True
seen[s[::-1]] = True
count +=1
return count
答案 1 :(得分:0)
这可以使用set()
函数直接完成,但可能的时间最短,但它只会删除完全相同的字符串。因此,为了删除反向字符串,需要一个循环,但在此之前使用set()
过滤掉类似的字符串(未反转),这大大减少了循环迭代。
>>> def getUnique(st):
... st = set(st)
... unique = set()
... for x in st:
... if x[::-1] not in unique:
... unique.add(x)
... return list(unique)
...
>>> strings = ['abc','def','ghi','abc','cba','ihg','jkl','lkj','the']
>>> getUnique(strings)
set(['the', 'abc', 'lkj', 'ihg', 'def'])