字母的有效异位词的几种解决方法_Python

文章目录

  • 前言
  • 一、字母异位词
    • 暴力解法--使用内置函数sorted()
    • HashMap哈希表方法
  • 二、具体步骤
    • 1.暴力解法——sorted()
    • 2.HashMap哈希表
  • 三、错误实例
    • 直接利用ASII码之和求解
  • 总结

前言

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-anagram

提示:以下是本篇文章正文内容,下面案例可供参考

一、字母异位词

暴力解法–使用内置函数sorted()

HashMap哈希表方法

二、具体步骤

1.暴力解法——sorted()

代码如下(示例):

class Solutiondef isAnagram(s:str,t:str):sort_s = sorted(s)    #进行排序sort_t = sorted(t)if sort_s == sort_t :return Truereturn False

2.HashMap哈希表

我们在此题把哈希表当作一维数组(列表)去执行,
制定一个名recoed的26个元素的数组,并且全为数值零。(用于记录)

record=[0 for i in range(26)]#列表推导式
record = [0]*26

我们应该如何才能将26个字母一一对应到record的26个位置呢?

record[0]--->'a'
record[1]--->'b'
.
.
.
record[4]--->'e'
#通过ASII码可以实现
record[ord('a')-ord('a')]=record[0]
record[ord('b')-ord('a')]=record[1]所以:
record[ord(string)-ord("a")] += 1

之后我们先用for循环,遍历一下字符串s ,例如s=‘aee’
现在recoed数组用于记录ABCDEFGHLJK…这些字母出现的次数。
开始遍历,指针i指向s[0], s[0]=‘a’
此时数组record应该是这样:

record=[1,0,0,0,0,0,...] #共26个,a出现一次

继续遍历,指针i 指向s[1],s[1]=‘e’
此时数组record应该是这样:

record=[1,0,0,1,0,0,0....]#此时a,e共出现一次

之后第三次遍历,指针指向s[2],s[2]=‘e’
此时’e’已出现两次
那么,此时的数组record应该是:

record=[1,0,0,2,0,0...] #e出现两次

此时我们把字符串s='aee’遍历完成了
接下来我们遍历字符t=‘eae’
刚刚上面是添加次数,那么这里我们需要减少了
也就是说在现在record的基础上,字符串t出现了s中有的字母
我们需要减去1
第一次遍历 j=‘e’
第二次遍历 j=‘a’
第三次遍历 j=‘e’

record=[1,0,0, 2-1 ,0,0...] #第一次遍历 t
record=[ 1-1 ,0,0,0,1,0,0...]#第二次遍历 t
record=[0,0,0, 1-1 ,0,0] #第三次遍历 t
record=[0,0,0,0,0,0......] #第四次遍历

当record和前面定义的一样时,就说明s和t是有效异位词。
具体代码如下:

class Solution:def isAnagram(s:str,t:str):record=[0 for i in range(26)]for i in s:record[ord(i)-ord('a')]+=1print(record)for j in t:record[ord(j)-ord('a')]-=1print(record)for z in record:if z!=0:return False else:return Truedef main():print(Solution.isAnagram('aee','eae'))
Solution.main()

三、错误实例

直接利用ASII码之和求解

一开始我把问题过于简单化了,题目给的例子是
s=‘aee’,t=‘eae’
s=‘paragrm’,t=‘arapgrm’
我就在想竟然只是位置变了,那我可以直接取ASII值相加
如果两个值相等就返回True,否则返回False

class Solution:def isAnagram(s:str,t:str):total = 0total_1 = 0 for i in s:total += ord(i)for j in t:total_1 += ord(j)if total == total_1:return Trueruturn Falsedef main()print(Solution.isAnagram())
Solution.main()

你能看出来哪里错了吗?

总结

第一次写博客,是我的一次学习收获也是一种成长,我较为详细地描述了整个变化过程,有许多不足,望各位大神指正,我也会继续努力下去!


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部