Given two strings s and t , write a function to determine if t is an anagram of s.
Example 1:
Input: s = "anagram", t = "nagaram" Output: true
Example 2:
Input: s = "rat", t = "car" Output: false
Note:
You may assume the string contains only lowercase alphabets.
题目:输入两个字符串s和t,判断s和t是否是一组变位词(anagram,每个字符出现的频率相同,字符位置可能不同)。假设输入的字符串只包含小写字母。
实现思路1:如果s和t是一组变位词,那么对两个字符串的所有字符进行升序排列的结果应完全相同。因此,分别对s和t的字符数组进行排序,然后逐位比较两个字符数组,如果出现不相同字符则返回false,如果所有字符都相同则返回true。
class Solution {
public boolean isAnagram(String s, String t) {
if (s == null || t == null) throw new IllegalArgumentException("argument is null");
if (s.length() != t.length()) return false;
char[] sChars = s.toCharArray();
char[] tChars = t.toCharArray();
Arrays.sort(sChars);
Arrays.sort(tChars);
for (int i = 0; i < sChars.length; i++)
if (sChars[i] != tChars[i])
return false;
return true;
}
}
实现思路2:用一个map统计s中每个字符出现的频率。遍历t的所有字符,如果map中含有t的某个字符,则将map中该字符对应的出现频率减一。按上述操作后,如果map中的每个value都是0,说明s和t是一组变位词。如果map中的某个value不是0,说明s和t不是一组变位词。由于题目规定了输入的字符串只包含小写字母,因此实现时用容量为26的数组来保存字母出现频率即可。
class Solution {
public boolean isAnagram(String s, String t) {
if (s == null || t == null) throw new IllegalArgumentException("argument is null");
int[] count = new int[26];
for (char c : s.toCharArray())
count[c - 'a']++;
for (char c : t.toCharArray())
count[c - 'a']--;
for (int i : count)
if (i != 0) return false;
return true;
}
}
参考资料:
https://leetcode.com/problems/valid-anagram/solution/