问题描述
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
示例
输入: s = "anagram", t = "nagaram"
输出: true
输入: s = "rat", t = "car"
输出: false
说明:
你可以假设字符串只包含小写字母。
进阶:
如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?
思路
原来网易校招面试题是出自这儿。
已经做过了就直接上思路。用hashmap。遍历s,对于每个s中的字符进行计数。
遍历t,对t中的每个字符进行反计数,如果减多了直接返回false。(方法一)
这题由于限定了小写字母,因此可以设置一个容量为26的数组。通过char-'a’的方式确定放到哪里模拟了哈希表,这样能少写点代码。 (方法二)
方法一
Java版
class Solution {
public boolean isAnagram(String s, String t) {
if(s.length() != t.length()){
return false;
}
Map<Character,Integer> map = new HashMap<>();
for(int i = 0; i < s.length(); i++){
if(map.containsKey(s.charAt(i))){
map.replace(s.charAt(i),map.get(s.charAt(i))+1);
}else{
map.put(s.charAt(i),1);
}
}
for(int i = 0; i < t.length(); i++){
if(!map.containsKey(t.charAt(i))){
return false;
}else if(map.get(t.charAt(i)) < 1){
return false;
}else{
map.replace(t.charAt(i),map.get(t.charAt(i))-1);
}
}
return true;
}
}
方法二
Java版
class Solution {
public boolean isAnagram(String s, String t) {
if(s.length() != t.length()){
return false;
}
int[] map = new int[26];
for(int i = 0; i < s.length(); i++){
map[s.charAt(i)-'a']++;
}
for(int i = 0; i < t.length(); i++){
if(map[t.charAt(i)-'a']<1){
return false;
}
map[t.charAt(i)-'a']--;
}
return true;
}
}