题目描述
给定两个字符串
*s*
和*t*
,编写一个函数来判断*t*
是否是*s*
的字母异位词。**注意:**若
*s*
和*t*
中每个字符出现的次数都相同,则称*s*
和*t*
互为字母异位词。示例 1:
输入: s = "anagram", t = "nagaram" 输出: true
示例 2:
输入: s = "rat", t = "car" 输出: false 提示: 1 <= s.length, t.length <= 5 * 104 s 和 t 仅包含小写字母
解题思路1
字符异位词,说白了就是比较两个字符串中不同字符的个数是不是都一致。
基本思路就是,在遍历第一个字符串时,将每个字符的出现次数保存起来(我首先想到的就是HashMap),这样等遍历第二个字符串的时候,再把相应的字符的次数减1,如果存在map中没有key的情况,那就说明肯定不是异位词。另外,如果最后这个map中的所有值存在不是0的值,那也不是异位词。
代码实现1
class Solution {
public boolean isAnagram(String s, String t) {
//创建一个hashMap
Map<Character,Integer> map = new HashMap<Character,Integer>();
//将s存入map
for(int i = 0; i < s.length(); i++){
char c = s.charAt(i);
if(map.containsKey(c)){
map.put(c, map.get(c) + 1 );
}else {
map.put(c,1);
}
}
//修改map值
for(int j = 0; j < t.length(); j++){
char c = t.charAt(j);
if(map.containsKey(c)){
map.put(c, map.get(c) - 1);
}else {
return false;
}
}
//检查map值
for(Character key : map.keySet()){
if(map.get(key) != 0){
return false;
}
}
return true;
}
}
解题思路2
利用题目条件,s和t中只有小写字母,那也就意味着只需要长度为26的数组就可以存放a~z所有的字符,然后用当前字符减去’a’就是索引。然后按照上面的方法计数就可以。
代码实现2
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++)
if(alpha[i] != 0)
return false;
return true;
}
}