给定两个字符串 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));
}