编写一个函数repfree(s),该函数将字符串s作为输入,并检查是否有任何字符出现多次。如果没有重复,则该函数应返回True,否则返回False。
我已经试过了,但我觉得这不是一个有效的解决方法。你能建议一个有效的代码吗,谢谢?
def repfree(s):
newlist = []
for i in range(0, len(s)):
newlist.append(s[i])
newlist2 = set(newlist)
if len(newlist) == len(newlist2):
print("True")
else:
print("False")
8条答案
按热度按时间2ledvvac1#
满足这一要求的一个简单方法是使用正则表达式。您可能不被允许使用它们,但如果可以,请考虑以下情况:
laawzig22#
信不信由你,这个问题可以在O(1)时间内解决,因为每个足够大的字符串都至少包含一个重复字符,毕竟不同的Unicode字符的数量是有限的,所以一个字符串不能任意长,同时每个Unicode字符最多使用一次。
例如,如果您碰巧知道字符串仅由小写字母组成,则可以执行以下操作:
否则,可以用字符串可能包含的任意字符数替换
26
;例如用于大写和小写字母和数字的62
。截至2020年2月,整个Unicode有137,994个不同字符(Wikipedia),所以如果你的字符串长度是150,000,那么你可以返回
True
而不需要搜索。44u64gxh3#
试试看
但是,这是一个很长的路要走,因为它扫描列表26次。一个更好的和Python的方式将是
这里,
results
是将s的所有字符作为关键字、将其频度作为值的字典,如果有大于1的值,则判断是否发生了重复。cvxl0en24#
您可以将字符串字符拆分为
set
并比较长度5anewei65#
可以通过删除for循环来提高方法的效率。
否则,请尝试使用任何
xoshrz7s6#
你可以这样做:
方法一:
方法二:
为什么是
set
?set
将按排序顺序返回字符串中所有唯一字符的列表示例:
输出:
因此,如果字符串中的一个字符出现多次,它将不等于字符串本身的长度。
quhf5bfb7#
92dk7w1h8#
def匹配(s):stack = [],用于秒中字符:如果字符== '(':堆栈.append(字符)elif字符== ')':如果不堆叠:return False stack.pop()返回非堆栈