class Solution {
public:
bool isAnagram(string s, string t) {
}
};
242. 有效的字母异位词
给定两个字符串 s
和 t
,编写一个函数来判断 t
是否是 s
的字母异位词。
注意:若 s
和 t
中每个字符出现的次数都相同,则称 s
和 t
互为字母异位词。
示例 1:
输入: s = "anagram", t = "nagaram" 输出: true
示例 2:
输入: s = "rat", t = "car" 输出: false
提示:
1 <= s.length, t.length <= 5 * 104
s
和 t
仅包含小写字母
进阶: 如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?
原站题解
python3 解法, 执行用时: 72 ms, 内存消耗: 16.2 MB, 提交时间: 2023-10-28 12:47:16
class Solution: def isAnagram(self, s: str, t: str) -> bool: record = [0] * 26 for i in range(len(s)): #并不需要记住字符a的ASCII,只要求出一个相对数值就可以了 record[ord(s[i]) - ord("a")] += 1 print(record) for i in range(len(t)): record[ord(t[i]) - ord("a")] -= 1 for i in range(26): if record[i] != 0: #record数组如果有的元素不为零0,说明字符串s和t 一定是谁多了字符或者谁少了字符。 return False #如果有一个元素不为零,则可以判断字符串s和t不是字母异位词 break return True # Python写法二(没有使用数组作为哈希表,只是介绍defaultdict这样一种解题思路): def isAnagram2(self, s: str, t: str) -> bool: from collections import defaultdict s_dict = defaultdict(int) t_dict = defaultdict(int) for x in s: s_dict[x] += 1 for x in t: t_dict[x] += 1 return s_dict == t_dict
python3 解法, 执行用时: 44 ms, 内存消耗: 16.3 MB, 提交时间: 2023-10-28 12:46:36
class Solution: def isAnagram(self, s: str, t: str) -> bool: if len(s) != len(t): return False count = {} for char in s: if char in count: count[char] += 1 else: count[char] = 1 for char in t: if char in count: count[char] -= 1 else: return False for value in count.values(): if value != 0: return False return True
golang 解法, 执行用时: 8 ms, 内存消耗: 2.7 MB, 提交时间: 2023-10-28 12:45:45
func isAnagram1(s, t string) bool { var c1, c2 [26]int for _, ch := range s { c1[ch-'a']++ } for _, ch := range t { c2[ch-'a']++ } return c1 == c2 } func isAnagram2(s, t string) bool { s1, s2 := []byte(s), []byte(t) sort.Slice(s1, func(i, j int) bool { return s1[i] < s1[j] }) sort.Slice(s2, func(i, j int) bool { return s2[i] < s2[j] }) return string(s1) == string(s2) } // with unicode func isAnagram(s, t string) bool { if len(s) != len(t) { return false } cnt := map[rune]int{} for _, ch := range s { cnt[ch]++ } for _, ch := range t { cnt[ch]-- if cnt[ch] < 0 { return false } } return true }
cpp 解法, 执行用时: 4 ms, 内存消耗: 7.5 MB, 提交时间: 2023-10-28 12:44:48
class Solution { public: // sort bool isAnagram1(string s, string t) { if (s.length() != t.length()) { return false; } sort(s.begin(), s.end()); sort(t.begin(), t.end()); return s == t; } // hash bool isAnagram(string s, string t) { if (s.length() != t.length()) { return false; } vector<int> table(26, 0); for (auto& ch: s) { table[ch - 'a']++; } for (auto& ch: t) { table[ch - 'a']--; if (table[ch - 'a'] < 0) { return false; } } return true; } };
java 解法, 执行用时: 15 ms, 内存消耗: 42.5 MB, 提交时间: 2023-10-28 12:43:56
class Solution { // sort public boolean isAnagram1(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); } // hash public boolean isAnagram2(String s, String t) { if (s.length() != t.length()) { return false; } int[] table = new int[26]; 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; } // 输入字符串包含 unicode 字符 public boolean isAnagram(String s, String t) { if (s.length() != t.length()) { return false; } Map<Character, Integer> table = new HashMap<Character, Integer>(); for (int i = 0; i < s.length(); i++) { char ch = s.charAt(i); table.put(ch, table.getOrDefault(ch, 0) + 1); } for (int i = 0; i < t.length(); i++) { char ch = t.charAt(i); table.put(ch, table.getOrDefault(ch, 0) - 1); if (table.get(ch) < 0) { return false; } } return true; } }
golang 解法, 执行用时: 0 ms, 内存消耗: 2.8 MB, 提交时间: 2021-07-18 08:32:03
func isAnagram(s string, t string) bool { if len(s) != len(t) { return false } cnt := [26]int{} for _, ch := range s { cnt[ch-'a']++ } for _, ch := range t { cnt[ch-'a']-- } for _, c := range cnt[:] { if c != 0 { return false } } return true }
golang 解法, 执行用时: 12 ms, 内存消耗: 3 MB, 提交时间: 2021-06-12 03:28:54
func isAnagram(s string, t string) bool { if len(s) != len(t) { return false } b1, b2 := []byte(s), []byte(t) sort.Slice(b1, func(i, j int) bool { return b1[i] < b1[j] }) sort.Slice(b2, func(i, j int) bool { return b2[i] < b2[j] }) return string(b1) == string(b2) }