关于Python字符串唯一性校验函数及无内容if语句的技术疑问咨询
2. Python字符串唯一性校验函数的疑问解答
先把对应的函数代码贴出来方便参考:
def unique(string): if len(string) > 128: return False char_set = [False for _ in range(128)] for char in string: val = ord(char) if char_set[val]: return False char_set[val] = True return True
(1)第10行代码是否为else语句?若不是,其作用是什么?
这行代码不是else语句,它是函数在for循环正常结束后执行的return语句。
解释一下:当for循环完整遍历完字符串的所有字符,中途没有因为发现重复字符而提前return False,就说明字符串里的所有字符都是唯一的。这时候函数就返回True,告诉调用者这个字符串符合“所有字符唯一”的条件。
(补充:Python确实支持for...else语法,但这里的return True和for没有绑定,是独立的顶层语句哦。)
(2)第8行代码是否表示当char_set[val]为True时返回False?通常是否采用此种写法?
没错,这行代码的逻辑就是:如果char_set[val]已经是True,说明这个字符之前已经在字符串里出现过了,于是立刻返回False(表示字符串存在重复字符)。
这种写法非常常见,属于提前终止优化——一旦发现不符合条件的情况,马上结束函数,不用继续遍历剩下的字符,能有效提升代码的执行效率。在类似的校验场景(比如查重、找符合条件的元素)中,这种“尽早返回”的写法是行业惯例,大家都这么写~
(3)第5行的[False for _ in range(128)]代码的作用是什么?
这行代码是创建一个长度为128的列表,每个元素的初始值都是False。
为什么是128?因为标准ASCII字符集正好包含128个字符(从0到127的ASCII码)。这个列表的作用是记录每个ASCII字符是否已经出现过:
- 列表的索引对应字符的ASCII码值(通过
ord(char)获取) - 当某个字符第一次出现时,我们把列表对应索引的位置设为
True;如果后续再遇到同一个字符,就能通过检查列表对应位置的值,快速判断出这个字符已经重复了。
这种用列表做标记的方式,能让我们以O(1)的时间复杂度完成字符重复检查,整个函数的时间复杂度是O(n)(n是字符串长度),效率很高。
内容的提问来源于stack exchange,提问作者user14901649
相关产品推荐
相关产品推荐

