思路:字母相互抵消的思路,本题字符串中只包含小写字母26位,那就新建record数组int[26],下标0-25,代表小写字母a-z, 需要通过 某字符减a 来达到这一目的;
class Solution {
public boolean isAnagram(String s, String t) {
//这里record数组,下标0-25,代表小写字母a-z, 需要通过 某字符减a 来达到这一目的;
//字符相减得到数字,如:b-a = 1,z-a=25,因为字符ASCLL码中,b比a大1,z比a大25;
int[] record = new int[26];
//通过相互抵消的思路,记录s字符串每个字符出现的次数;
for(int i=0; i<s.length();i++) {
record[s.charAt(i) - 'a']++;
}
//在t字符串中抵消,字符出现就次数减1
for(int j=0; j<t.length();j++){
record[t.charAt(j) - 'a']--;
}
//遍历看看抵消完是不是都是0
for(int k =0;k<record.length;k++){
if(record[k]!=0){
return false;
}
}
return true;
}
}
这个382题也是一样的道理,只是抵消之后,可能有的值会 小于0
class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
if(ransomNote.length()>magazine.length()) return false;
//下标表示字母,元素值表示次数;
int[] record = new int[26];
//抵消思想
for(int i=0;i<magazine.length();i++){
record[magazine.charAt(i) - 'a']++;
}
for(int i=0;i<ransomNote.length();i++){
record[ransomNote.charAt(i) - 'a']--;
}
for(int i=0;i<record.length;i++){
if(record[i]<0){
return false;
}
}
return true;
}
}