题目:
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;*/
}
}