有效的字母异位词——判断两个字符串包含的字符以及字符出现的次数是否相同
题目描述解读
判断是否是字母异位词即判断字符串中是否只有字符的位置不同,也就是判断两个字符串中包含的字符以及这些字符出现的次数是否相同
我的解题思路(1)
- 首先既然只有位置不同,那么长度不同的字符串必然不符合要求。
- 将字符串转换为字符数组之后对数组进行排序,这两个数组中的元素必然全部相等
代码:
public boolean isAnagram(String s, String t) {
char[] temp1 = s.toCharArray();
char[] temp2 = t.toCharArray();
Arrays.sort(temp1);
Arrays.sort(temp2);
String m =String.copyValueOf(temp1);
String n =String.copyValueOf(temp2);
if(m.compareTo(n) == 0){
return true;
}else{
return false;
}
}
在最后比较字符串的时候还成直接遍历数组比较每一个元素而不是转换成字符串比较,执行时间应该会缩短一些
更好的解题思路
题目提示只考虑小写字母,那么遍历数组记录26个字母中每个字母的出现次数,只有两个字串中对应的字符出现次数完全相同才满足条件
代码如下:
public boolean isAnagram(String s, String t) {
if (s.length() != t.length())
return false;
int[] sIntArray = new int[26];
int[] tIntArray = new int[26];
for (char c : s.toCharArray()) {
sIntArray[c - 'a']++;
}
for (char c : t.toCharArray()) {
tIntArray[c - 'a']++;
}
for (int i = 0; i < tIntArray.length; i++) {
if(tIntArray[i] != sIntArray[i]) {
return false;
}
}
return true;
}
针对这个代码的建议:
只生成一个中间数组用来保存字符出现的次数,在遍历第一个字符数组时出现对应字符则+1,然后再遍历第二个字符数组时出现对应字符则-1,可以少创建一个数组。