本文共 2306 字,大约阅读时间需要 7 分钟。
给定两个字符串 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
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. Mapmap = 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. }
转载地址:http://epuvi.baihongyu.com/