给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的一个字母异位词。
示例 1:
输入: s = "anagram", t = "nagaram"
输出: true
示例 2:
输入: s = "rat", t = "car"
输出: false
说明:
你可以假设字符串只包含小写字母。
进阶:
如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?
思路1:
/*** 先转成整数数组,然后排序,然后挨个字符对比* 时间复杂度O(nlog(n))* 空间复杂度O(n)* @param s* @param t* @return*/public boolean isAnagram(String s, String t) {if(s.length() != t.length()) {return false;}int[] a = new int[s.length()];int[] b = new int[t.length()];for(int i=0;i<s.length();i++) {a[i] = s.charAt(i);}for(int i=0;i<t.length();i++) {b[i] = t.charAt(i);}Arrays.sort(a);Arrays.sort(b);for(int i=0;i<s.length();i++) {if(a[i] != b[i]) {return false;}}return true;}
思路2:对思路1进行优化,直接对字符数组进行排序
public boolean isAnagram:(String s, String t) {if(s.length() != t.length()) {return false;}char[] a = s.toCharArray();char[] b =t.toCharArray();Arrays.sort(a);Arrays.sort(b);for(int i=0;i<s.length();i++) {if(a[i] != b[i]) {return false;}}return true;}
思路3:不排序,统计字母出现次数
public boolean isAnagram(String s, String t) {if(s.length() != t.length()) {return false;}Map<Character, Integer> mapS = new HashMap<Character, Integer>();Map<Character, Integer> mapT = new HashMap<Character, Integer>();for(char c:s.toCharArray()) {mapS.put(c, mapS.get(c) == null?1:mapS.get(c) +1);}for(char c:t.toCharArray()) {mapT.put(c, mapT.get(c) == null?1:mapT.get(c) +1);}if(mapS.size() != mapT.size()) {return false;}for(char c :mapS.keySet()) {if(!mapT.containsKey(c) || mapT.get(c).intValue() != mapS.get(c).intValue()) {return false;}}return true;}
思路4,使用字母表存储(当前最优)
/*** 思路4:思路3优化版:使用字母表存储* 时间复杂度O(nlog(n))* 空间复杂度O(n)* @param s* @param t* @return*/public boolean isAnagram(String s, String t) {if(s.length() != t.length()) {return false;}int[] si = new int[26];int[] ti = new int[26];for(char c:s.toCharArray()) {si[c-'a']++;}for(char c:t.toCharArray()) {ti[c-'a']++;}for(int i=0;i<26;i++) {if(si[i] != ti[i]) {return false;}}return true;}
5、思路5,使用类库,缩短代码
public boolean isAnagram(String s, String t) {if(s.length() != t.length()) {return false;}char []a = s.toCharArray();char[]b = t.toCharArray();Arrays.sort(a);Arrays.sort(b);return String.valueOf(a).equals(String.valueOf(b));}