Leetcode题库 - 有效的字母异位词(java语言版)
题目描述:
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的一个字母异位词。
示例 1:
输入: s = "anagram", t = "nagaram" 输出: true
示例 2:
输入: s = "rat", t = "car" 输出: false
说明:
你可以假设字符串只包含小写字母。
本题第一种思路和上一篇博客:两数组的交集2很相似,可以参照上一篇博客:https://blog.****.net/weixin_37850160/article/details/88540203
本题看题目很容易理解:什么是有效的字母异位数呢?就是两个字符串相等并且每个字符出现的次数都是一样的。这样的数就是有效的字母异位数。抓住这两点,这道题就很好理解。
第一种思路:用哈希map存储第一个字符串,键为字符的值,值为字符出现的次数。遍历第二个字符串,判断每个字符是否出现在map中并且判断出现的次数是否一致,任意一项不满足则不是有效的字母异位数。当遍历完成时,则就是有效的字符异位数。
第二种思路:这个思路很简单,就是把两个字符串声明为字符数组,然后排序两个字符数组,然后遍历比较即可,对应元素都相同则是有效的,对应元素不相同则是无效的。(假如这两个字符数组,是有效的字母异位词,则排序完后就是字符一模一样的两个数组,这样比较完肯定是有效的。)这种方法简单,时间复杂度也比较低。但推荐用第一种,可以学习map的相关用法,是很不错的方法。
注意:这两种思路的前提都是:两个字符串都是相同长度,不同长度时直接输出false.
第一种思路:
String s="anagram";
String t="nagaram";
// 第一种方法用map存储第一个数组,key为数组元素,值为数组元素出现的次数。
if (t.length ()!=s.length ()){
System.out.println(s+"和"+t+"不是字母异位词");
}else{
Map<Character,Integer> map = new HashMap <> ( );
for (int i =0;i<s.length ();i++){
// 将字符添加到map中,有就+1,没有就添加赋值,定义次数为1
if (!map.containsKey ( s.charAt ( i ) )) {
map.put ( s.charAt ( i ) , 1 );
}else {
map.put ( s.charAt ( i ), map.get ( s.charAt ( i ) )+1);
}
}
System.out.println(map);
// 遍历数组二进行比较,看是否存在这个元素,并且次数是否相同
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 {
System.out.println(s+"和"+t+"不是有效的字母异位数");
}
}
System.out.println ( s+"和"+t+"是字母异位词" );
}
执行结果:
执行用时:
第二种方法:
if (t.length ()!=s.length ()){
System.out.println("不是字母异位词");
}else {
char[] chars1=s.toCharArray ( );
char[] chars2=t.toCharArray ( );
// 重点先排序
Arrays.sort ( chars1 );
Arrays.sort ( chars2 );
// 遍历任意数组,进行比较
for (int i= 0;i<chars1.length;i++){
if (chars1[i]!=chars2[i]){
System.out.println(s+"和"+t+"不是有效的字母异位词");
break;
}
}
System.out.println(s+"和"+t+"是有效的字母异位词");
}
执行结果:
执行用时:
总结:这道题思路很明确,用到了map的相关用法,也学习到了更加简便的方法,多动多想,脑袋才不会生锈。
2019-3-14