Python字典排序字符串的Anagram
这个问题在这里已经有了答案:
一个纯粹的Python解决方案,用于获取与字符串中字符的字符数(t)相对应的对象,
使用函数chr()
您可以将int
转换为相应的ascii
值,因此您可以轻松地使用97
至123
并使用chr()
来获取该字母表的值。
所以如果你有一个字符串说:
t = "abracadabra"
那么你可以做一个for-loop
如:
dt = {}
for c in range(97, 123):
dt[chr(c)] = t.count(chr(c))
这为解决方案的这部分工作回馈了以下结果:
{'k': 0, 'v': 0, 'a': 5, 'z': 0, 'n': 0, 't': 0, 'm': 0, 'q': 0, 'f': 0, 'x': 0, 'e': 0, 'r': 2, 'b': 2, 'i': 0, 'l': 0, 'h': 0, 'c': 1, 'u': 0, 'j': 0, 'p': 0, 's': 0, 'y': 0, 'o': 0, 'd': 1, 'w': 0, 'g': 0}
不同的解决方案?
评论是受欢迎的,但为什么存储在一个dict
必要的? 使用count()
,你不能简单地比较t
每个char的计数和s
中char的计数吗? 如果t
中char
的计数大于s
返回False
else True
。
沿着以下方向的东西:
def question1(s, t):
for c in range(97, 123):
if t.count(chr(c)) > s.count(chr(c)):
return False
return True
这给出了结果:
>>> question1("udacity", "city")
True
>>> question1("udacity", "ud")
True
>>> question1("udacity", "ljljl")
False
如果需要dict
...
如果是这样,那么就像上面那样创建两个并遍历每个键......
def question1(s, t):
ds = {}
dt = {}
for c in range(97, 123):
ds[chr(c)] = s.count(chr(c))
dt[chr(c)] = t.count(chr(c))
for c in range(97, 123):
if dt[chr(c)] > ds[chr(c)]:
return False
return True
更新
上面的答案只检查子字符不是SUBSTRING的字符。 正如马拉卡在评论中向我解释的那样,这两者之间有所区别,你的例子清楚地表明了这一点。
使用滑动窗口的想法(通过切分字符串),下面的代码应该适用于子字符串 :
def question1(s, t):
dt = {}
for c in range(97, 123):
dt[chr(c)] = t.count(chr(c))
for i in range(len(s) - len(t) + 1):
contains = True
for c in range(97, 123):
if dt[chr(c)] > s[i:i+len(t)].count(chr(c)):
contains = False
break
if contains:
return True
return False
上面的代码适用于所有情况,并使用字典来加速正确的计算:)
import collections
print collections.Counter("google")
Counter({'o': 2, 'g': 2, 'e': 1, 'l': 1})
链接地址: http://www.djcxy.com/p/40069.html
上一篇: Python dictionary sorting Anagram of a string
下一篇: What is the Big Oh of these two implementations of the same algorithm?