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

15 篇文章 0 订阅
14 篇文章 0 订阅

题前

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

题目大意

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 <script type="math/tex" id="MathJax-Element-146">k</script>是常数项

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值