题目描述:
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
输入: s = "anagram", t = "nagaram" 输出: true
输入: s = "rat", t = "car" 输出: false
思路:
1、可以用排序,然后再进行比较是否相同。不过再这个之前,可以先判断两个字符串长度是否相同,如果不同,可以直接返回false。
public boolean isAnagram(String s, String t) {
if (s.length() != t.length()) {
return false;
}
char[] str1 = s.toCharArray();
char[] str2 = t.toCharArray();
Arrays.sort(str1);
Arrays.sort(str2);
return Arrays.equals(str1, str2);
}
2、哈希表。因为涉及到字母,都是只包含26个字母,可以创建一个大小为26的数组
然后进行分别计算S字符串中字母的频率和T字符串中字母的频率,S增加,T减少,最后,如果计数器为0,那么说明两个字符串是字母异位词
或者可以先用计数器计算S,然后用T减少每个字母,如果任何时候计数器低于0,就知道T包含一个不在S中的额外字母,就可以立即返回False
Java
class Solution {
public boolean isAnagram(String s, String t) {
//如果我们s和 t 的长度不一样,则立即返回false
if (s.length() != t.length()) {
return false;
}
//只有26个字符大小
int[] table = new int[26];
//先用计数器表计算 s,然后用 t 减少计数器表中的每个字母的计数器。如果在任何时候计数器低于零,我们知道 t包含一个不在 s中的额外字母,并立即返回 FALSE
for (int i = 0; i < s.length(); i++) {
table[s.charAt(i) - 'a']++;
}
for (int i = 0; i < t.length(); i++) {
table[t.charAt(i) - 'a']--;
if (table[t.charAt(i) - 'a'] < 0) {
return false;
}
}
return true;
}
}
C 语言
bool isAnagram(char * s, char * t){
if(strlen(s)!=strlen(t)) return false;
int table[26]={};
for(int i=0;i<strlen(s);++i){
table[s[i]-'a']++;
}
for(int i=0;i<strlen(t);++t){
table[t[i]-'a']--;
if(table[t[i]-'a']<0) return false;
}
return true;
}
C++
class Solution {
public:
bool isAnagram(string s, string t) {
if(s.size()!=t.size()){
return false;
}
int table[26]={};
for(int i=0;i<s.size();++i){
table[s[i]-'a']++;
}
for(int i=0;i<t.size();++i){
table[t[i]-'a']--;
if(table[t[i]-'a']<0){
return false;
}
}
return true;
}
};
Python
直接调用使用内置模块collections中的Counter类
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
return collections.Counter(s) == collections.Counter(t)