题目:
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
示例 1:
输入: s = "anagram", t = "nagaram" 输出: true
示例 2:
输入: s = "rat", t = "car" 输出: false
解题:
方法一:哈希表(i)
先把一个字符串的每个字符放入哈希表计数,再遍历另外一个字符串,每出现一次,就让哈希表对应的值减去一,如果没有可以减的了,就返回False
class Solution: def isAnagram(self, s: str, t: str) -> bool: if len(s)!=len(t): return False hush = dict() for char in s: hush[char] = hush.get(char,0)+1 for char in t: if char not in hush: return False else: if hush[char] == 0: return False else: hush[char] -=1 return True
上面这个写法不太好,推荐使用下面的
在字符串s出现的字符数量+1,在字符串t出现的字符数量-1。最后判断,哈希表键对应的值都是0就代表有效的字母异位词。
python解法
class Solution: def isAnagram(self, s: str, t: str) -> bool: hush = {} for c in s: hush[c] = hush.get(c,0)+1 for c in t: hush[c] = hush.get(c,0)-1 for key in hush.keys(): if hush[key]!=0: return False return True
c++解法
利用数组当作哈希表
class Solution { public: bool isAnagram(string s, string t) { if(s.length()!=t.length()){ return false; } vector<int> table(26,0); for(char& c:s){ table[c-'a']++; } for(char& c:t){ table[c-'a']--; if(table[c-'a']<0){ return false; } } return true; } };
或
class Solution { public: bool isAnagram(string s, string t) { vector<int> table(26); for(char& c:s){ table[c-'a']++; } for(char& c:t){ table[c-'a']--; } for(int i=0;i<26;i++){ if(table[i]!=0){ return false; } } return true; } };
java解法
class Solution { public boolean isAnagram(String s, String t) { int[] mp=new int[26]; for(int i=0;i<s.length();i++){ mp[s.charAt(i)-'a']++; } for(int i=0;i<t.length();i++){ if(mp[t.charAt(i)-'a']==0) return false; else{ mp[t.charAt(i)-'a']--; } } for(int i=0;i<26;i++){ if(mp[i]>0) return false; } return true; } }
更通用点
class Solution { public boolean isAnagram(String s, String t) { Map<Character,Integer> mp=new HashMap<Character,Integer>(); for(int i=0;i<s.length();i++){ char c=s.charAt(i); mp.put(c,mp.getOrDefault(c,0)+1); } for(int i=0;i<t.length();i++){ char c=t.charAt(i); if(mp.getOrDefault(c,0)<=0) return false; mp.put(c,mp.getOrDefault(c,0)-1); } for(Map.Entry<Character,Integer> entry:mp.entrySet()){ Character key=entry.getKey(); Integer value=entry.getValue(); if(value>0) return false; } return true; } }
方法二:排序
python解法
如果排完序后的结果一样就说明是字母异位词
class Solution: def isAnagram(self, s: str, t: str) -> bool: if sorted(s)==sorted(t): return True return False
java
class Solution { 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); } }
方法三:Counter计数器(i)
python解法
class Solution: def isAnagram(self, s: str, t: str) -> bool: if Counter(s)==Counter(t): return True return False
如果不适用Counter,就用普通的字典
class Solution: def isAnagram(self, s: str, t: str) -> bool: if len(s)!=len(t): return False hush1 = dict() hush2 = dict() for i in range(len(s)): hush1[s[i]] = hush1.get(s[i],0)+1 hush2[t[i]] = hush2.get(t[i],0)+1 return hush1==hush2
因为字典是没有顺序的,只要里面的键值对相等,那么返回的就是True