题前
刚写了一个二叉树生成,就没有二叉树的题目可以做了哎。。
题目大意
Valid Anagram是有效字谜的意思(Valid -> 有效, Anagram -> 字谜)。
输入为两个字符串,判断他们是不是同一个字母表的组合(假定全部为小写字母)。
思路
偷偷看了一眼Hint中的HashTable,再加有一个Tag关于如何把算法推广到unicode字符串上。很容易想到一个基本解法,统计计算每个字符的数目,但是肯定太慢了。
# 鉴于统计方法的实现比较容易,先写一个放这里。
# 目测肯定time exceed.
class Solution(object):
def isAnagram(self, s, t):
if len(s) != len(t):
return False
for i,j in zip(sorted(list(s)),sorted(list(t))):
if i != j:
return False
return True
CSDN的Markdown的缩进真恶心。以及,然而并没有超时,但也是最慢的那一丢了。。。
优化方法
考虑从dict中实现一个。
class Solution(object):
def isAnagram(self, s, t):
d_s, d_t = {},{}
if len(s) != len(t):
return False
for i,j in zip(s, t):
if i not in d_s.keys():
d_s[i] = 1
else:
d_s[i] += 1
if j not in d_t.keys():
d_t[j] = 1
else:
d_t[j] += 1
if d_s != d_t:
return False
return True
Orz,这样更慢了。
class Solution(object):
def isAnagram(self, s, t):
if len(s) != len(t):
return False
n_s, n_t = [0 for i in xrange(27)] , [0 for i in xrange(27)]
for i,j in zip(map(lambda s: ord(s) - 97, s),map(lambda s: ord(s) - 97, t)):
n_s[i] += 1
n_t[j] += 1
if n_s != n_t :
return False
return True
方法一
简单粗暴,应付很长很长的数据集时,会非常慢,是 n∗log(n) 级别的
方法二
已经比较慢了,如果数据中类型较多的话,会非常慢是 n∗t 级别的, t 是指数据类别(这里是27)
方法三
比二快了一些,但是适用范围很小,是k∗n 的, k <script type="math/tex" id="MathJax-Element-146">k</script>是常数项
这个题要补充一些参考的代码。