題目:
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.
題意解析:
這個題和以前的 383. Ransom Note 非常像。
Anagram 的意思是:迴文構詞法,也就是“由顛倒字母順序而構成的字[短語]”。
思路與步驟:
思路1:
只要兩個字符串中出現的字母和字母出現的次數一樣,則表示是 Valid Anagram 。這樣有兩種解法:
解法1-1:
用 HashMap ,Key 爲字母,Value 爲字母的次數。這裏我想到了兩種方法:
第一種是將兩個字符串都用這樣的 HashMap 來存儲,最後比較這倆是否相等。
第二種是將用第一個字符串初始化,然後對第二個字符串中的每個字母,如果在 map 中存在,則個數減1,最後 map 中的 Value 全爲 0 ,則表示是 Anagram。
解法1-2:
思路同上面 1-1 中的第二種一樣,只是改用 數組,數組的下標是字母(但是需要轉化成整數)的 ASCII 碼,即 schar - 'a' ,數組內容是字母出現的次數。
思路2:
逐個比較法,由於是 Anagram,即亂序的,所以先將兩個字符串分別排序,然後逐個比較即可。
編程實現:
Solution-1
用兩個 HashMap
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(char schar: s.toCharArray()) smap.put(schar, smap.getOrDefault(schar,0)+1);
Map<Character, Integer> tmap = new HashMap<Character, Integer>();
for(char tchar: t.toCharArray()) tmap.put(tchar, tmap.getOrDefault(tchar,0)+1);
if(smap.equals(tmap)) return true;
else return false;
}
}
Solution-2
用一個字符串來初始化 HashMap,另一個字符串來判斷
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(char schar: s.toCharArray()) smap.put(schar, smap.getOrDefault(schar,0)+1);
for(char tchar: t.toCharArray()){
if(smap.containsKey(tchar) && smap.get(tchar)>1) smap.put(tchar, smap.get(tchar)-1);
else if(smap.containsKey(tchar) && smap.get(tchar)==1) smap.remove(tchar);
else if(!smap.containsKey(tchar)) return false;
}
if(smap.isEmpty()) return true;
else return false;
}
}
Solution-3
用數組
public class Solution {
public boolean isAnagram(String s, String t) {
if(s.length() != t.length()) return false;
int[] count = new int[26];
for(char schar: s.toCharArray()) count[schar-'a']++;
for(char tchar: t.toCharArray()) count[tchar-'a']--;
for(int i : count) if (i != 0) return false;
return true;
}
}
Solution-4
先排序
public class Solution {
public boolean isAnagram(String s, String t) {
if(s.length() != t.length()) return false;
char[] sArray = s.toCharArray();
char[] tArray = t.toCharArray();
Arrays.sort(sArray);
Arrays.sort(tArray);
return Arrays.equals(sArray, tArray);
/*int i=0;
while(i < s.length() && sArray[i] == tArray[i]) i++;
if(i == s.length()) return true;
else return false;*/
}
}