15-算法打卡-哈希表-有效的字母异位词-leetcode(242)-第十五天
1 题目地址
242. 有效的字母异位词 - 力扣(LeetCode)242. 有效的字母异位词 - 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的 字母异位词。 示例 1:输入: s = "anagram", t = "nagaram"输出: true示例 2:输入: s = "rat", t = "car"输出: false 提示: * 1 <= s.length, t.length <= 5 * 104 * s 和 t 仅包含小写字母 进阶: 如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?https://leetcode.cn/problems/valid-anagram/description/
2 题目说明
给定两个字符串 s
和 t
,编写一个函数来判断 t
是否是 s
的 字母异位词。
字母异位词是通过重新排列不同单词或短语的字母而形成的单词或短语,并使用所有原字母一次。
示例 1:
输入: s = "anagram", t = "nagaram" 输出: true
示例 2:
输入: s = "rat", t = "car" 输出: false
提示:
1 <= s.length, t.length <= 5 * 104
s
和t
仅包含小写字母
3 解题思路
方式一: 定义一个数组叫做record用来上记录字符串s里字符出现的次数。然后遍历字符串s查找record对应下标的数据-1;最后遍历record如果都等于0则是异位词,否则不是。
a、s和t仅包含小写字母
b、26个字母,record长度可以定义成26, [0,25]
c、s[i] - 'a'; 可以得到对应的record下标,给值+1
d、 t[i] - 'a';可以得到对应的record下标,给值-1
方式二: 可以使用Map存储s的数据,key是字符比如‘a’, value: 表示对应的数量;字符串t分割后,去Map中查找对应的数据,并将value-1,查找不到则不是异位词。否则Map为空也表示是异位词
4 代码编写
4.1 哈希(数组)实现
注意:字符串长度计算是length方法,数组长度计算是length属性;字符串指定位置的字符是chatAt方法
class Solution {public boolean isAnagram(String s, String t) {int[] record = new int[26];for (int i=0; i<s.length(); i++) {int index = s.charAt(i) - 'a';record[index]++;}for (int i=0; i<t.length(); i++) {int index = t.charAt(i) - 'a';record[index]--;}for (int i=0; i<record.length; i++) {if (record[i]!=0) {return Boolean.FALSE;}}return Boolean.TRUE;}
}

4.2 Map实现
class Solution {public boolean isAnagram(String s, String t) {Map<Character, Integer> tempMap = new HashMap<>();for (int i=0; i<s.length(); i++) {char c = s.charAt(i);if (tempMap.containsKey(c)) {int a = tempMap.get(c) + 1;tempMap.put(c, a);} else {tempMap.put(c, 1);}}for (int i=0; i<t.length(); i++) {char c = t.charAt(i);if (tempMap.containsKey(c)) {int a = tempMap.get(c)-1;if (a==0) {tempMap.remove(c);} else {tempMap.put(c, a);}} else {return Boolean.FALSE;}}if (tempMap==null || tempMap.isEmpty()) {return Boolean.TRUE;}return Boolean.FALSE;}
}