面试金典02(Python)—— 判定是否互为字符重排(简单)

判定是否互为字符重排

概述:给定两个字符串 s1s2,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。

输入: s1 = "abc", s2 = "bca"
输出: true 

输入: s1 = "abc", s2 = "bad"
输出: false

方法一:暴力循环

思路:最简单粗暴的办法,依次循环两个字符串。但需要注意的是,在第二重循环中需要剔除已经相同的某个字符串。

# 暴力循环
class Solution:
    def CheckPermutation(self, s1: str, s2: str) -> bool:
        if len(s1) != len(s2):
            return False
        for i in range(len(s1)):
            if s1[i] not in s2:
                return False
            for j in range(len(s2)):
                if s1[i] == s2[j]:
                    s2 = s2[:j] + s2[j + 1:]
                    break
        return True

方法二:排序+判断

思路:该算法应用了列表 sort() 方法,再对两个列表判断即可。

# 排序+判断
class Solution:
    def CheckPermutation(self, s1: str, s2: str) -> bool:
        s1_list = list(s1)
        s1_list.sort()
        s2_list = list(s2)
        s2_list.sort()
        s1_new = ''.join(s1_list)
        s2_new = ''.join(s2_list)
        return s1_new == s2_new

方法三:collections.Counter()

思路:该算法用到了 collections.Counter() 内置函数,可以快速统计字符串中每个字符出现次数,最后判断即可。

# collections.Counter()
class Solution:
    def CheckPermutation(self, s1: str, s2: str) -> bool:
        return Counter(s1) == Counter(s2)

方法三:哈希表

思路:该算法非常巧妙,首先以一个字符串( s1 或 s2 均可)最为哨点,依次循环添加到字典中。再对另外一个字符串依次循环,在已有的字典中做减法,若存在负数,表明不存在。

# 哈希表
class Solution:
    def CheckPermutation(self, s1: str, s2: str) -> bool:
        s_dict = {}
        for i in s1:
            if i not in s_dict:
                s_dict[i] = 1
            else:
                s_dict[i] += 1
        for j in s2:
            if j not in s_dict:
                s_dict[j] = -1
            else:
                s_dict[j] -= 1
            if s_dict[j] < 0:
                return False
        return True

总结

简单题秀操作!

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值