题目
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
示例 :
输入: s = "anagram", t = "nagaram"
输出: true
输入: s = "rat", t = "car"
输出: false
说明:你可以假设字符串只包含小写字母。
标签
字符串;排序;哈希表;字符数组
解题思路
方法一:排序比较
将字符串转换为字符数组后,进行排序,然后按位比较大小。
方法二:哈希表
1)进行两次遍历,第一次统计每个字符出现的次数,第二次进行比较两个map具体出现的次数是否相等。【map遍历比较有多种实现方式】
2)也可以共用一个map,比如先建立字符串s的map,然后在遍历t时,将t与s重复的元素次数进行递减,最后如果某个递减后的次数小于0便是false。
代码
public class Leetcode242_ValidAnagram {
public static void main(String[] args) {
String s = "anagram";
String t = "nagaram";
System.out.println(Leetcode242_ValidAnagram.isAnagram2(s, t));
}
//方法一:排序比较
public static boolean isAnagram(String s, String t) {
//将字符串升序排序
String s1 = rank(s);
String t1 = rank(t);
int lens = s1.length();
int lent = t1.length();
//return
if (lens == lent) {
for (int i = 0; i < lens; i++) {
if (s1.charAt(i) != t1.charAt(i)) {
return false;
}
}
return true;
}
return false;
}
//对字符串进行排序
public static String rank(String s) {
char[] array = s.toCharArray();
Arrays.sort(array);
//valueOf返回指定值的String实例
return String.valueOf(array);
//返回的仍然是字符数组
//return Arrays.toString(array);
}
//方法1.1:排序比较
public static boolean isAnagram1(String s, String t) {
//将字符串升序排序
char[] s1 = s.toCharArray();
char[] t1 = t.toCharArray();
Arrays.sort(s1);
Arrays.sort(t1);
//比较字符数组的大小
return Arrays.equals(s1, t1);
}
//方法二:哈希表
public static boolean isAnagram2(String s, String t) {
Map map_s = new HashMap<>();
Map map_t = new HashMap<>();
if (s.length() == t.length()) {
//建立每个字符与出现的次数之间的映射
for (int i = 0; i < s.length(); i++) {
map_s.put(s.charAt(i), map_s.getOrDefault(s.charAt(i), 0) + 1);
map_t.put(t.charAt(i), map_t.getOrDefault(t.charAt(i), 0) + 1);
}
//进行比较
//哈希方法1:keySet()迭代器
// Iterator iter1 = map_s.keySet().iterator();
// while (iter1.hasNext()) {
// Character s_key = (Character) iter1.next();
// if (!map_s.get(s_key).equals(map_t.get(s_key))) {
// return false;
// }
// }
// return true;
//哈希方法2:keySet(),for each
// for (Character c : map_s.keySet()) {
// if (!map_s.get(c).equals(map_t.get(c))) {
// return false;
// }
// }
// return true;
//哈希方法3:entrySet()
for (Map.Entry entry1 : map_s.entrySet()) {
if (!entry1.getValue().equals(map_t.get(entry1.getKey()))) {
return false;
}
}
return true;
}
return false;
}
//方法三:哈希表2
public static boolean isAnagram3(String s, String t) {
if (s.length() != t.length()) {
return false;
}
//共用一个map
Map map = new HashMap<>();
//生成map_s
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
map.put(ch, map.getOrDefault(ch, 0) + 1);
}
//对字符串t与s中字符重复的,将次数进行删减
for (int i = 0; i < t.length(); i++) {
//t的字符
char ch = t.charAt(i);
map.put(ch, map.getOrDefault(ch, 0) - 1);
if (map.get(ch) < 0) {
return false;
}
}
return true;
}
}
来源:力扣(LeetCode)