检查一个字符串是否都是唯一的字符,空格除外
我正在练习裂解编码面试的问题以变得更好,以防万一,以备随时使用。第一个问题是:查找一个字符串是否包含所有唯一字符?我写这和它完美的作品:检查一个字符串是否都是唯一的字符,空格除外
def isunique(string):
x = []
for i in string:
if i in x:
return False
else:
x.append(i)
return True
现在,我的问题是,如果我有所有的独特字符,如在: “我是J” 这将是非常罕见的,但可以说这只是偶然发生,我怎么能为这些空格创建一个例外?我认为它不会将空间算作角色,所以func返回True而不是False?
现在不管多么空间或有多少特殊字符在您的字符串,它只会算的话:
import re
def isunique(string):
pattern=r'\w'
search=re.findall(pattern,string)
string=search
x = []
for i in string:
if i in x:
return False
else:
x.append(i)
return True
print(isunique('I am J'))
输出:
True
没有空间词语测试用例:
print(isunique('war'))
True
与空间的话测试用例:
print(isunique('w a r'))
True
重复的字母:
print(isunique('warrior'))
False
选项1
优雅的方法,将具有collections.Counter
from collections import Counter
def isunique(string):
return Counter(string.replace(' ', '')).most_common(1)[0][-1] == 1
选项2 稍微更有效,但不太漂亮。
def isunique(string):
c = Counter()
for s in string.replace(' ', ''):
c[s] += 1
if c[s] > 1:
return False
return True
In [141]: isunique('I am JJ')
Out[141]: False
In [142]: isunique('I am J')
Out[142]: True
该解决方案将不会在整个列表循环,如果有可能检测到重复的越快。
如果你的字符串包含的不仅仅是更多的空格(制表符和例如换行),我建议基于正则表达式替换:
import re
string = re.sub(r'\s+', '', string, flags=re.M)
创建人物的名单,你要考虑为非字符并将其替换为字符串。然后执行你的功能代码。
作为替代,以检查字符的独特性,更好的办法将是最终的字符串的长度的set
值进行比较,该字符串为:
def isunique(my_string):
nonchars = [' ', '.', ',']
for nonchar in nonchars:
my_string = my_string.replace(nonchar, '')
return len(set(my_string)) == len(my_string)
样品试验:
>>> isunique('I am J')
True
按了Python的set() document
:
返回一个新的集合对象,可选地使用从迭代中提取的元素。 集是一个内置的类。有关该课程的文档,请参见set和Set Types - set,frozenset 。
简单的解决方案
def isunique(string):
return all(string.count(i)==1 for i in string if i!=' ')
简单就是最好!这个函数具有二次复杂性,而且非常慢。 –
而且......答案池是永远不会完成,除非也有一个正则表达式的解决方案:
def is_unique(string):
import re
patt = re.compile(r"^.*?(.).*?(\1).*$")
return not re.search(patt, string)
(我会留下空白处理作为练习到OP)
使用'isspace()' – mentalita
我建议只是在将'string.replace(“”,“”)传递给你已经在使用的'isunique'函数中运行... – Shadow
@mentalita how你会完全融入isspace()吗?如果我在for循环中这样做,它会使字符串成为布尔值而不是可迭代的 – MAUCA