題目:
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=; i< s.length(); ++i)
{
if(sMap.containsKey(s.charAt(i)))
{
int tmp = sMap.get(s.charAt(i))+;
sMap.put(s.charAt(i), tmp);
}
else{
sMap.put(s.charAt(i), );
}
}
for(int j = ; j<t.length(); ++j)
{
if(!sMap.containsKey(t.charAt(j))) return false;
else{
int tmp = sMap.get(t.charAt(j))-;
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)!=)
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));
}
}