LeetCode-探索-初级算法-字符串-4. 有效的字母异位词(个人做题记录,不是习题讲解)
LeetCode探索-初级算法:https://leetcode-cn.com/explore/interview/card/top-interview-questions-easy/
- 有效的字母异位词
-
语言:java
-
思路:一开始想直接用异或运算,发现不行,如果是aa和bb,异或判断不了。后面就老实先判断长度是否相等,再用2个数组存储字母出现频率来比较
-
代码(4ms):
class Solution { public boolean isAnagram(String s, String t) { int len1 = s.length(); int len2 = t.length(); int[] arr1 = new int[26]; int[] arr2 = new int[26]; if(len1!=len2) return false; else{ for(int i = 0; i < len1; ++i){ arr1[s.charAt(i)-97]+=1; arr2[t.charAt(i)-97]+=1; } for(int i = 0; i < 26; ++i){ if(arr1[i]!=arr2[i]) return false; } } return true; } }
-
参考代码(1ms):其实思路是一样的,不过他用空间换时间,减少了char和int的转换。
class Solution { public boolean isAnagram(String s, String t) { char[] charArr1 = s.toCharArray(); char[] charArr2 = t.toCharArray(); char[] charCount = new char[256]; for (int i = 0; i < charArr1.length; i++) { charCount[charArr1[i]]++; } for (int i = 0; i < charArr2.length; i++) { charCount[charArr2[i]+26]++; } for (int i = 97; i < 97+26; i++) { if(charCount[i] != charCount[i+26]) return false; } return true; } }
-
参考后重写(2ms):估计是因为减法比较耗时(后面试了下,改用2数组都是加法,也是耗时,这应该涉及优化问题了,先不追究了)
class Solution { public boolean isAnagram(String s, String t) { char[] sc = s.toCharArray(); char[] tc = t.toCharArray(); char[] arr = new char[256]; int len1 = sc.length; int len2 = tc.length; if(len1!=len2){ return false; } for(int i = 0; i < len1; ++i){ arr[sc[i]]+=1; arr[tc[i]]-=1; } for(int i = 97; i <= 123; ++i){ if(arr[i]!=0) return false; } return true; } }