2017-10-15 102 views
0

我正在练习裂解编码面试的问题以变得更好,以防万一,以备随时使用。第一个问题是:查找一个字符串是否包含所有唯一字符?我写这和它完美的作品:检查一个字符串是否都是唯一的字符,空格除外

def isunique(string): 
    x = [] 
    for i in string: 
     if i in x: 
      return False 
     else: 
      x.append(i) 
    return True 

现在,我的问题是,如果我有所有的独特字符,如在: “我是J” 这将是非常罕见的,但可以说这只是偶然发生,我怎么能为这些空格创建一个例外?我认为它不会将空间算作角色,所以func返回True而不是False?

+1

使用'isspace()' – mentalita

+2

我建议只是在将'string.replace(“”,“”)传递给你已经在使用的'isunique'函数中运行... – Shadow

+0

@mentalita how你会完全融入isspace()吗?如果我在for循环中这样做,它会使字符串成为布尔值而不是可迭代的 – MAUCA

回答

1

现在不管多么空间或有多少特殊字符在您的字符串,它只会算的话:

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 
0

选项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) 
0

创建人物的名单,你要考虑为非字符并将其替换为字符串。然后执行你的功能代码。

作为替代,以检查字符的独特性,更好的办法将是最终的字符串的长度的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 。

-1

简单的解决方案

def isunique(string): 
    return all(string.count(i)==1 for i in string if i!=' ') 
+1

简单就是最好!这个函数具有二次复杂性,而且非常慢。 –

0

而且......答案池是永远不会完成,除非也有一个正则表达式的解决方案:

def is_unique(string): 
    import re 
    patt = re.compile(r"^.*?(.).*?(\1).*$") 
    return not re.search(patt, string) 

(我会留下空白处理作为练习到OP)

相关问题