Python实现"有效的字母异位词"的两种方法

给定两个字符串s和t,写一个函数用于判断t是否是s的字母异位词

Example 1:

Input: s = "anagram", t = "nagaram"
Output: true

Example 2:

Input: s = "rat", t = "car"
Output: false

注意:

你可以假设字符串只包含小写字母

进阶:

如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?

1:该题的本质是考察两个字符串的字母种类和字母对应数量是否相同,相同即是有效的字母异位词。比如例1,s字符串和t字符串,a、n、g、r、m的个数均分别为3、1、1、1、1,所以结果为True

def isAnagram(self, s, t):
        """
        :type s: str
        :type t: str
        :rtype: bool
        """
        if len(s) != len(t):
            return False
        chaDic = {}
        for i in s:
            chaDic[i] = chaDic.get(i, 0) + 1
        for i in t:
            if i not in chaDic:
                return False
            else:
                if chaDic[i] == 1:
                    del chaDic[i]
                else:
                    chaDic[i] -= 1
        return chaDic == {}

2:用set()方法,过滤s字符串中重复的字母,生成彼此不重复的集合L。访问L集合,判断每个字母在s和t字符串中的数量是否相等,进行对应的操作(参考他人)

def isAnagram(self, s, t):
        """
        :type s: str
        :type t: str
        :rtype: bool
        """
        if len(s) != len(t):
            return False
        for i in set(s):
            if s.count(i) != t.count(i):
                return False
        return True    

优雅的写法(参考他人)

all() 函数用于判断给定的可迭代参数 iterable 中的所有元素是否都为 TRUE,如果是返回 True,否则返回 False。

元素除了是 0、空、FALSE 外都算 TRUE。

函数等价于:

def all(iterable):
    for element in iterable:
        if not element:
            return False
    return True
def isAnagram(self, s, t):
        """
        :type s: str
        :type t: str
        :rtype: bool
        """
        return len(s) == len(t) and all([s.count(i) == t.count(i) for i in set(s)])   

类似的写法,因为字符串只包括小写字母(参考他人)

def isAnagram(self, s, t):
        """
        :type s: str
        :type t: str
        :rtype: bool
        """
        chaStr = "qwertyuiopasdfghjklzxcvbnm"
        if len(s) != len(t):
            return False
        for i in chaStr:
            if s.count(i) != t.count(i):
                return False
        return True    
            

算法题来自:https://leetcode-cn.com/problems/valid-anagram/description/

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值