文章目录
前言
被测试用例整懵逼了,感觉自己是对的。。。
一、有效的字母异位词
题目:给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
摘要:两个字符串、每个字符出现的次数都相同才称两个字符串互为异位词
原思想:
首先创建两个HashMap,然后将字符串转化成两个char型的数组,然后遍历两个char型数组,存入HashMap中,格式为:Key(char)-》Value(Integer) 也就是每个字符出现的次数,然后遍历第一个HashMap,如果第一个HashMap的Key对应的Value与第二个HashMap的Key对应的Value值相同,就使得统计数加一,最后,如果统计数等于第一个HashMap的大小并且也等于第二个HashMap的大小说明两个字符串每个单词出现的次数都i一样,返回true,否则返回false。
原代码:
class Solution {
public boolean isAnagram(String s, String t) {
Map<Character,Integer> map_s = new HashMap();
Map<Character,Integer> map_t = new HashMap();
char[] chars = s.toCharArray();
char[] chart = t.toCharArray();
int j=0;//统计每个字符的出现次数是否相同,如果一个字符的出现次数相同则+1
//先分别统计s和t每个字符出现的次数
for(char ch:chars){
map_s.put(ch,map_s.getOrDefault(ch,0)+1);
//getOrDefault是按字符ch的出现次数增加,如果一次都没有,则默认为0
}
for(char ch:chart){
map_t.put(ch,map_t.getOrDefault(ch,0)+1);
}
int k = map_s.size();
int m = map_t.size();
Set<Character> keys=map_s.keySet();
for(char key:keys){
if(map_s.get(key)==map_t.get(key)){
j++;
}
}
if(j==k&&j==m){
return true;
}
else{
return false;
}
}
}
问题:
新思想:
1.差值统计法:
先统计字符串s中每个字符的数量,减去t中每个字符对应的数量,如果最后的统计数有不为0的,说明有不重复的,统计数全为0,那么就是全部重复。
2.先排序,再比较:
排序之后两个元素应该一模一样,如果不一样,那么就返回false
3.哈希方法的改进:
一个转化为HashMap,然后遍历另一个,在遍历过程中,如果HashMap有另一个的元素,则value值减一,那么最后的HashMap的value值应该为0,如果不为0,说明有重复的
对于思想1的新代码:
public boolean isAnagram(String s, String t) {
if (s.length() != t.length())
return false;
int[] letterCount = new int[26];
//统计字符串s中的每个字符的数量
for (int i = 0; i < s.length(); i++)
letterCount[s.charAt(i) - 'a']++;
//减去字符串t中的每个字符的数量
for (int i = 0; i < t.length(); i++) {
//如果当前字符等于0,直接返回false,
if (letterCount[t.charAt(i) - 'a'] == 0)
return false;
letterCount[t.charAt(i) - 'a']--;
}
return true;
}
对于思想2的新代码:
public boolean isAnagram(String s, String t) {
char[] sChar = s.toCharArray();
char[] tChar = t.toCharArray();
//对两个字符串中的字符进行排序
Arrays.sort(sChar);
Arrays.sort(tChar);
return Arrays.equals(sChar, tChar);
}
对于思想3的新代码:
class Solution {
public boolean isAnagram(String s, String t) {
if (s.length() != t.length()) {
return false;
}
Map<Character, Integer> table = new HashMap<Character, Integer>();
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
table.put(ch, table.getOrDefault(ch, 0) + 1);
}
for (int i = 0; i < t.length(); i++) {
char ch = t.charAt(i);
table.put(ch, table.getOrDefault(ch, 0) - 1);
if (table.get(ch) < 0) {
return false;
}
}
return true;
}
}
总结
1.语法还是比较弱,得多敲
2.一开始再得到两个hashmap之后,要比较两个hashmap是否一样时出现了卡壳