给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
题目解析:
先对两个字符串进行长度判断,若不相等则一定不是字母异位词
解法一:可以先将s字符串出现的字母放入hashMap中,键存放字母,值存放出现字数,然后再遍历t进行对比
解法二:可以像赎金信的解法差不多,用一个数组记录26字母在s中出现的次数,然后再遍历t进行对比
解法三:将两个字符串放入字符数组中,并进行排序,然后进行值比较
(注意:不能使用 字符数组.equals(字符数组),因为数组是对象,这样是进行内存地址比较,要使用Arrays类重写的静态方法equals() )
方法一:
class Solution {
public boolean isAnagram(String s, String t) {
if (s.length() != t.length()){
return false;
}
Map<Character,Integer> map = new HashMap<>();
for (int i = 0; i <s.length() ; i++) {
if (map.containsKey(s.charAt(i))){
map.put(s.charAt(i),map.get(s.charAt(i))+1);
}else {
map.put(s.charAt(i),1);
}
}
for (int i = 0; i <t.length() ; i++) {
if ( map.containsKey(t.charAt(i)) && map.get(t.charAt(i))>0 ){
map.put(t.charAt(i), map.get(t.charAt(i))-1 );
}else {
return false;
}
}
return true;
}
}
运行结果:
方法二:
class Solution {
public boolean isAnagram(String s, String t) {
if (s.length() != t.length()){
return false;
}
int[] arr = new int[26];
for (int i = 0; i <s.length() ; i++) {
int suoyin = s.charAt(i) - 'a';
arr[suoyin]++;
}
for (int i = 0; i <t.length() ; i++){
int suoyin2 = t.charAt(i) - 'a';
if (arr[suoyin2]>0){
arr[suoyin2]--;
}else {
return false;
}
}
return true;
}
}
运行结果:
方法三:
class Solution {
public boolean isAnagram(String s, String t) {
if (s.length() != t.length()){
return false;
}
char[] sArray = s.toCharArray();
char[] tArray = t.toCharArray();
Arrays.sort(sArray);
Arrays.sort(tArray);
/*
//错误,此处进行的是内存地址比较,而不是值比较
// == 也是进行内存地址比较
if (sArray.equals(tArray)){
return true;
}
return false;
*/
return Arrays.equals(sArray,tArray);
}
}
运行结果: