题目:
Given two strings s and t, write a function to determine if t is an anagram of s.
For example,
s = “anagram”, t = “nagaram”, return true.
s = “rat”, t = “car”, return false.
Note:
You may assume the string contains only lowercase alphabets.
理解题意:字符串t是字符串s中一些或者全部字母颠倒顺序得到的,就是anagram。
初始想法:用一个hashMap<Integer,Character>
遍历保存s中字符,然后遍历t字符串,若遍历的当前字符不存在map
中,直接返回false
;若字符包含在map
中,则删除改映射。实现上有问题,hashMap
中containsValue(Object value)
函数返回的是布尔值,无法得到key
,就不能通过remove
函数删除映射关系。
正确思路:hashMap<Character, Integer> 遍历保存s中字符
,key
为字符,value
为字符出现的次数。在遍历t中字符时,若当前字符在map
中不存在,返回false
;若存在,通过hashMap.get(Object key)
得到该字符出现的次数,减一,更新hashmap
。最后看map
的value的视图集合中,值是否有不等于0的,若没有则是anagram。
代码实现:
public class Solution {
public boolean isAnagram(String s, String t) {
if(s.length() != t.length()) return false;
Map< Character, Integer> sMap = new HashMap<Character, Integer>();
for(int i=0; i< s.length(); ++i)
{
if(sMap.containsKey(s.charAt(i)))
{
int tmp = sMap.get(s.charAt(i))+1;
sMap.put(s.charAt(i), tmp);
}
else{
sMap.put(s.charAt(i), 1);
}
}
for(int j =0 ; j<t.length(); ++j)
{
if(!sMap.containsKey(t.charAt(j))) return false;
else{
int tmp = sMap.get(t.charAt(j))-1;
sMap.put(t.charAt(j), tmp);
}
}
Set<Character> keySet = sMap.keySet();
Iterator<Character> iter= keySet.iterator();
while(iter.hasNext())
{
Character key = iter.next();
if(sMap.get(key)!=0)
return false;
}
return true;
}
}
在网上看到另解:
因为变形词两个单词对应字母出现的次数都相同,所以如果将两个单词按字母顺序排序,肯定会变为一个字符串,如果字符串不相同,则不是变形词。
public class Solution {
public boolean isAnagram(String s, String t) {
char[] sArr=s.toCharArray();
char[] tArr=t.toCharArray();
Arrays.sort(sArr);
Arrays.sort(tArr);
return String.valueOf(sArr).equals(String.valueOf(tArr));
}
}