今日学习:
242.有效的字母异位
1002.查找常用字符
*这两题的类型都可以按照同一个原理来做:“小写字符”,“出现频率”, 当出现这些关键字就是利用哈希法来完成的。两题是用了同一个方法来完成,只是第二题可以看作第一题的进阶,需要考虑到更多内容,第一道题先用来理解使用的方法。
242.有效的字母异位
题目描述:
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
示例 1: 输入: s = "anagram", t = "nagaram" 输出: true
示例 2: 输入: s = "rat", t = "car" 输出: false
说明: 你可以假设字符串只包含小写字母。
思考总结:这题真的完全想不到题解的方法,开始也很难理解;之前看到有说在完成算法的时候尽量不去调用太多已经存在库里的方法(例如:Array类),而是要自己写解决的方法。
首先理解概念:字母异位就是给出的两个单词所包含的所有字母出现的频率都是相同的。
-第一块实现代码:是利用哈希法完成的,方法是:因为要对字母相关进行判断,因此设置一个长度为26的数组,先遍历第一个字符串,利用charAt()方法将遍历到的每个字母转化成字符,再将这个字符减去字符a,也就是会到这个字符在数组中的位置,当出现这个字符那么就+1,计算总频数;接下来要遍历第二个字符串,方法和原理都是和第一个字符串一样的,唯一的不同是,当遍历到每一个字符后需要进行减去的操作,是因为若出现和第一个字符串相同的字符那么数量就会减;最后若数组里面全为0时就表示证明是字母异位,而出现的其他情况表示不符合返回false;
-第二块实现代码:是第二种方法,尽量使用第一种方法,第二种方法是:首先将两个字符串分别利用toCharArray(),将字符串转化为字符数组,然后利用·Array类将这两个数组按照字母顺序排序,最后遍历这两个数组,比较是全都相等,若成立则返回true,反之false.
实现代码:
class Solution {
public boolean isAnagram(String s, String t) {
int [] result=new int[26];
for(int i=0;i<s.length();i++){
result[s.charAt(i)-'a']++;
}
for(int j=0;j<t.length();j++){
result[t.charAt(j)-'a']--;
}
for(int count:result){
if(count!=0){
return false;
}
}
return true;
}
}
class Solution {
public boolean isAnagram(String s, String t) {
if(s.length()!=t.length()){
return false;
}
char [] a=s.toCharArray();
char [] b=t.toCharArray();
Arrays.sort(a);
Arrays.sort(b);
return Arrays.equals(a,b);
}
}
1002.查找常用字符
题目描述:
给你一个字符串数组 words ,请你找出所有在 words 的每个字符串中都出现的共用字符( 包括重复字符),并以数组形式返回。你可以按 任意顺序 返回答案。
示例 1:
输入:words = ["bella","label","roller"] 输出:["e","l","l"]
示例 2:
输入:words = ["cool","lock","cook"] 输出:["c","o"]
思考总结:首先在计算每个字符串内包含的字符频数和第一题是同样的方法;设置两个长度为26的数组,第一个数组专门用来统计字符串数组里第一个字符串的各字母频数,而另外一个数组用来计算字符串数组其余字符串出现各字母所有的频数,然后对这两个记录了字母频数的数组进行遍历,在同一个位置取最小的次数等于第一个数组对应位置次数(Math类),最后遍历第一个数组,首先先获得对应位置的字符(i+'a),然后将获得的字符转化成String类型加入List集合中,还要注意每执行完一次转化那么对应位置频数就要减1。
*这道题能够理解,但是实现过程是挺艰难的,但是要记住这种题的关键词然后才能有思路。
class Solution {
public List<String> commonChars(String[] A) {
List<String> result = new ArrayList<>();
if(A.length==0){
return result;
}
//统计第一个字符串中字母出现的频率
int[] hash= new int[26];
for (int i = 0; i < A[0].length(); i++) {
hash[A[0].charAt(i)- 'a']++;
}
// 统计除第一个字符串外字符的出现频率
for (int i = 1; i < A.length; i++) {
int[] hashOtherStr= new int[26];
for (int j = 0; j < A[i].length(); j++) {
hashOtherStr[A[i].charAt(j)- 'a']++;
}
//统计各字符出现的最小次数
for (int k = 0; k < 26; k++) {
hash[k] = Math.min(hash[k], hashOtherStr[k]);
}
}
for (int i = 0; i < 26; i++) {
while (hash[i] != 0) {
char c= (char) (i+'a');
result.add(String.valueOf(c));
hash[i]--;
}
}
return result;
}
}