题目描述:
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
示例 1:
输入: s = "anagram", t = "nagaram"
输出: true
示例 2:
输入: s = "rat", t = "car"
输出: false
说明:
你可以假设字符串只包含小写字母。
思路1:
两个int型数组,sArray和tArray,来储存s和t字符串中的字符情况,a对应数组下标0,b对应数组下标1。
最后比较两个数组内容情况。
代码1:
public class IsAnagram242 {
public boolean isAnagram(String s, String t) {
if (s.length() != t.length()) {
return false;
}
int[] sArray = new int[26];
int[] tArray = new int[26];
for (int i = 0; i < s.length(); i++) {
sArray[s.charAt(i) - 97]++;
tArray[t.charAt(i) - 97]++;
}
for (int i = 0; i < 26; i++) {
if (sArray[i] != tArray[i]) {
return false;
}
}
return true;
}
}
思路2:
用HashMap存储字符串1中的每个字符,然后用字符串2中的每个字符依次去看在HashMap中存在与否,一旦有一个不存在直接返回false;
注意:当两个字符串长度不一样时,直接返回false;
HashMap的更新:已经找到的字符要在HashMap中减掉。
此方法用时最长。
代码2:
public boolean isAnagram2(String str1, String str2) {
if (str1.length() != str2.length()) {
return false;
}
HashMap<Character, Integer> map = new HashMap<>();
for (int i = 0; i < str1.length(); i++) {
map.put(str1.charAt(i), map.getOrDefault(str1.charAt(i), 0) + 1);
}
for (int j = 0; j < str2.length(); j++) {
if (map.containsKey(str2.charAt(j)) && map.get(str2.charAt(j)) > 0) {
map.put(str2.charAt(j), map.get(str2.charAt(j)) - 1);
} else {
return false;
}
}
return true;
}
思路3:
将字符串存在字符数组中,用java中Arrays的sort方法将数组排序,然后用Arrays中的equals判断两数组是否一样。
此方法用时最短。
代码3:
public boolean isAnagram3(String str1, String str2) {
if (str1.length() != str2.length()) {
return false;
}
char[] ch1 = str1.toCharArray();
char[] ch2 = str2.toCharArray();
Arrays.sort(ch1);
Arrays.sort(ch2);
return Arrays.equals(ch1, ch2);
}