学习来自《代码随想录》
建议: 这道题目,大家可以感受到 数组 用来做哈希表 给我们带来的遍历之处。
题目链接/文章讲解/视频讲解:
题目:力扣题目链接
242 有效的字母异位词(用数组做哈希表)
题目描述
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
示例 1:
输入: s = "anagram", t = "nagaram"
输出: true
示例 2:
输入: s = "rat", t = "car"
输出: false
思路
我的思路(用map实现)
1、遍历字符串s,用一个表记录字母及其出现的次数,
2、再遍历字符串t,查找在表中是否存在相同的字母,如果有则将其次数减1。如果出现找不到字母的情况,则直接返回false。
3、最后检查表中每个字母的次数,如果有不为0 的,返回false,否则返回true。
题解思路:(用数组实现哈希表)
1、定义一个长度为26的数组,初始化值为0
2、遍历字符串s,在其字母的相对位置+1,记录字母出现的次数
3、再遍历字符串t,将字母对应位置的数字减1
4、最后检查数组每个位置的数字,如果有不为0 的,返回false,否则返回true。
代码
方法一:用数组实现哈希表
java版本
在实现中的代码问题
1、计算数组下标:s.charAt(i) - 'a'
而不是s[i] - 'a',否则会报错:
Line 5: error: array required, but String found
hashArray[s[i] - 'a']++;
charAt() 方法 属于java String 类,用于返回指定索引处的字符。索引范围为从 0 到 length() - 1。
2、计算字符串的长度:s.length()
计算数组的长度:array.length
class Solution {
public boolean isAnagram(String s, String t) {
int[] hashArray= new int[26];
for(int i = 0; i < s.length(); i++){
hashArray[s.charAt(i) - 'a']++;
}
for(int j = 0; j < t.length(); j++){
hashArray[t.charAt(j) - 'a']--;
}
for(int k = 0; k < hashArray.length; k++){
if(hashArray[k] != 0)
return false;
}
return true;
}
}
复杂度分析:
时间复杂度:O(n)
空间复杂度:O(1)
python 版本
在实现中的代码问题
1、计算列表下标:ord(i) - ord('a'),
而不是s[i] - 'a'也不是int(s[i] - 'a')
TypeError:string indices must be integers(字符串索引必须是整数)
也不是i-'a': TypeError: unsupported operand type(s) for -: 'str' and 'str'
ord() 函数是 chr() 函数(对于8位的ASCII字符串)或 unichr() 函数(对于Unicode对象)的配对函数,它以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII 数值,或者 Unicode 数值,
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
list = [0 for _ in range(26)]
for i in s:
list[ord(i) - ord('a')] += 1
for i in t:
list[ord(i) - ord('a')] -=1
for k in list:
if k != 0: #注意不要写成list[k] !=0
return False
return True
方法二:(python)使用collections模块中的defaultdict类
思路:
将s 、t分别存入两个defaultdict中,完成统计每个字符的统计工作,再比较两个defaultdict,如果一致说明每个字符出现的次数相等,是有效的字母异位词。
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
from collections import defaultdict
s_dict = defaultdict(int)
t_dict = defaultdict(int)
for x in s:
s_dict[x] += 1
for x in t:
t_dict[x] += 1
return s_dict == t_dict
方法三:(python)使用collections模块中的Counter类(计数器)
class Solution(object):
def isAnagram(self, s: str, t: str) -> bool:
from collections import Counter
a_count = Counter(s)
b_count = Counter(t)
return a_count == b_count