Problem:
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.
Follow up:
What if the inputs contain unicode characters? How would you adapt your solution to such case?
Analysis:
这个题目前想到三种方法,
第一:用hash,将s中的每个字符存入key,value存这个字符出现的次数。如果t中发现这个字符则value减1,如果t中的字符在hash中没有找到则返回false。
第二:用字符数组,将每个字符的个数存入相应的数组中。
第三:排序然后判断排序后的字符数组是否相等
Answer:
hash方法:
public class Solution {
public boolean isAnagram(String s, String t) {
//判断边界条件
if(s==null && t==null) return true;
if(s==null || t==null) return false;
//利用s和t的长度不等返回减少时间
int sLen=s.length();
int tLen=t.length();
if(sLen!=tLen) return false;
HashMap<Character,Integer> map = new HashMap<Character,Integer>();
for(int i=0;i<sLen;i++){
if(map.containsKey(s.charAt(i))) map.put(s.charAt(i),map.get(s.charAt(i))+1);
else map.put(s.charAt(i),1);
}
for(int i=0;i<tLen;i++){
if(map.containsKey(t.charAt(i))){
int temp = map.get(t.charAt(i));
if(temp>0) map.put(t.charAt(i),temp-1);
else return false;
}
else return false;
}
return true;
}
}
字符数组方法:
public boolean isAnagram(String s, String t)
{
// we do the following assumptions:
// - s and t do not contain any whitespaces which have to be removed
// - s and t do not contain ascii characters
char[] sMap = map(s);
char[] tMap = map(t);
return (Arrays.equals(sMap, tMap));
}
private char[] map(String s)
{
char[] map = new char[128];
for (int i = 0; i < s.length(); i++)
{
char c = s.charAt(i);
map[c] += 1;
}
return map;
}
下面是用hash的另一种解法,同时便利s和t,如果t中的字符在map中有则减1,如果没有则赋值为-1:
for(int i=0; i<n; i++){
charset.put(s.charAt(i), charset.containsKey(s.charAt(i)) ? charset.get(s.charAt(i))+1 : 1);
charset.put(t.charAt(i), charset.containsKey(t.charAt(i)) ? charset.get(t.charAt(i))-1 : -1);
}
for(int i: charset.values()){
if (i!=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));
}
}
经验:
- for(int i: charset.values()),map的values()方法。
- 利用字符数组,常规的字符128个,总的256个。
- char[] S= s.toCharArray();字符串转字符数组方法。
- Arrays.sort(S);数组排序方法。