题目大意
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的一个字母异位词。
示例 1:
输入: s = "anagram", t = "nagaram"
输出: true
示例 2:
输入: s = "rat", t = "car"
输出: false
说明:
你可以假设字符串只包含小写字母。
进阶:
如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?
解题思路:
统计两个字符串中各字母的出现次数,相同,则返回true;不同,则返回false。
使用Collections模块下的counter函数统计各字母出现的次数,返回一个字典。
使用operator模块下的eq(dic1,dic2),比较两个字典是否相同:相同则返回true,否则返回false
class Solution(object):
def isAnagram(self, s, t):
"""
:type s: str
:type t: str
:rtype: bool
"""
dic1=collections.Counter(s)
dic2=collections.Counter(t)
return operator.eq(dic1,dic2)
以下是Java版本:
解法一:
建立一个容量为26大小的int,并将字母转化为int值——将字符串的每个字母char值减去‘a'得到,作为数组索引,字母出现次数作为数组值:
1. public class Solution {
2. public boolean isAnagram(String s, String t) {
3. int[] ret=new int[26];
4. for(int i=0;i<s.length();i++){
5. ret[s.charAt(i)-'a']--;
6. }
7. for(int i=0;i<t.length();i++){
8. ++ret[t.charAt(i)-'a'];
9. }
10. for(int i=0;i<26;i++){
11. if(ret[i]!=0)
12. return false;
13. }
14. return true;
15.
16. }
17. }
Test:
1. import java.util.Arrays;
2. public class Solution {
3. public boolean isAnagram(String s, String t) {
4. char[] sArr = s.toCharArray();
5. char[] tArr = t.toCharArray();
6.
7. Arrays.sort(sArr);
8. Arrays.sort(tArr);
9.
10. return String.valueOf(sArr).equals(String.valueOf(tArr));
11. }
12. }
解法二:
用map,若map中含有此key,则value+1;否则 value置1,取的时候最后看是否为0,如果存在不为0的value,返回false
18. import java.util.HashMap;
19. import java.util.Map;
20.
21. public class Solution {
22. public boolean isAnagram(String s, String t) {
23. //长度不相等,返回false
24. if (s.length() != t.length())
25. return false;
26. //key为出现的字母,value为字母出现的次数
27. Map<Character, Integer> map = new HashMap<>();
28. for (int i = 0; i < s.length(); i++) {
29. if (map.containsKey(s.charAt(i))) {
30. map.put(s.charAt(i), map.get(s.charAt(i)) + 1);
31. } else
32. map.put(s.charAt(i), 1);
33. }
34. for (int i = 0; i < t.length(); i++) {
35. if (map.containsKey(t.charAt(i))) {
36. map.put(t.charAt(i), map.get(t.charAt(i)) - 1);
37. } else
38. return false;
39. }
40. for (int i = 0; i < s.length(); i++) {
41. if (map.get(s.charAt(i)) != 0)
42. return false;
43.
44. }
45. return true;
46. }
47. }