开荒新系列之LeetCode: 006-Valid Anagram

题前

刚写了一个二叉树生成,就没有二叉树的题目可以做了哎。。

题目大意

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

方法一
简单粗暴,应付很长很长的数据集时,会非常慢,是 nlog(n) 级别的
方法二
已经比较慢了,如果数据中类型较多的话,会非常慢是 nt 级别的, t 是指数据类别(这里是27)
方法三
比二快了一些,但是适用范围很小,是 kn 的, k 是常数项

这个题要补充一些参考的代码。

你可能感兴趣的:(程序模块,ACM题,编程语言)