版权声明:作者:xp_9512 来源:CSDN 版权声明:本文为博主原创文章,转载请附上博文链接! 原文: https://blog.csdn.net/qq_40981804/article/details/91413773
有效字母异位
-
题目
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 -
示例
示例 1:
输入: s = “anagram”, t = “nagaram”
输出: true
示例 2:
输入: s = “rat”, t = “car”
输出: false -
说明:
你可以假设字符串只包含小写字母。 -
思路
标签:哈希映射
1、首先判断两个字符串长度是否相等,不相等则直接返回 false
2、若相等,则初始化 26 个字母哈希表,遍历字符串 s 和 t
3、s 负责在对应位置增加,t 负责在对应位置减少
4、如果哈希表的值都为 0,则二者是字母异位词
- 代码
class Solution {
public boolean isAnagram(String s, String t) {
if (s.length() != t.length()) return false;
int[] alpha = new int[26];//用来存储结果
for (int i = 0; i < s.length(); i++) {
alpha[s.charAt(i) - 'a']++;
alpha[t.charAt(i) - 'a']--;
}
for (int i = 0; i < 26; i++) System.out.print(alpha[i]+" - ");
for (int i = 0; i < 26; i++) if (alpha[i] != 0) return false;
return true;
}
//测试用
public static void main(String[] args){
String a = "aryuib";
String c = "tryuib";
String b = "rtuiby";
Solution solution = new Solution();
System.out.println(solution.isAnagram(c,b));
}
}
-
进阶:
如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况? -
思路:
unicode情况下,字符太多了,创建的数组长度要按照unicode的长度来,这显然不合理 改用哈希表动态储存出现过的字符就ok了 -
代码
class Solution { public boolean isAnagram(String s, String t) { if (s.length() != t.length()|| s == null || t == null) { return false; } Map<Character, Integer> map = new HashMap<>();//哈希表存出现过的字符,以及出现次数 for (int i = 0; i < s.length(); i++) { if (!map.containsKey(s.charAt(i))) { map.put(s.charAt(i),1); } else { int integer = map.get(s.charAt(i))+1; map.put(s.charAt(i),integer); } } for (int j = 0; j < t.length(); j++) { if (!map.containsKey(t.charAt(j))) { return false; } else { int integer = map.get(t.charAt(j)) -1; if (integer < 0) return false; map.put(t.charAt(j),integer); } } //遍历HashMap Iterator it = map.entrySet().iterator(); for(Map.Entry<Character, Integer> entry: map.entrySet()){ if(entry.getValue() != 0) return false; } return true; } //测试 public static void main(String[] args){ String a = "aryuib"; String c = "tryuib"; String b = "rtuiby"; Solution solution = new Solution(); System.out.println(solution.isAnagram(a,b)); } }