最初的设想是统计各个字母出现的次数,来判断是否能组成所需的单词:
public boolean canConstruct(String ransomNote, String magazine) {
char[] mag = magazine.toCharArray();
Map<Character,Integer> map = new HashMap<>();
for(char i:mag){
if(!map.containsKey(i)){
map.put(i,1);
}
else {
map.put(i,map.get(i) + 1);
}
}
char[] ran = ransomNote.toCharArray();
for (char i:ran){
if(!map.containsKey(i)){
return false;
}
int num = map.get(i) - 1;
if(num < 0){
return false;
}
map.put(i,num);
}
return true;
}
不出所料,耗时非常久,首先查看官方题解,发现思路核心是一致的,但是不需要用Map来存,因为Java中好久都没有使用过 char 类型了,就把这个技巧给忘记了
public boolean canConstruct(String ransomNote, String magazine) {
int[] c = new int[26];
if(magazine.length() < ransomNote.length()){
return false;
}
char[] mag = magazine.toCharArray();
for(char n:mag){
c[n-'a']++;
}
char[] ran = ransomNote.toCharArray();
for (char n:ran){
c[n-'a']--;
if(c[n-'a'] < 0){
return false;
}
}
return true;
}
这两种代码的思路核心是一致的,首先遍历 magazine 字符串,得到所有字母出现的次数,然后检查 ransomNote
Comments NOTHING