给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。
如果可以,返回 true ;否则返回 false 。
magazine 中的每个字符只能在 ransomNote 中使用一次。
来源:力扣(LeetCode)
一、设计字符串的计数可以使用hash来统计
因为创建了hash,有了额外的空间和时间开销
public boolean canConstruct(String ransomNote, String magazine) {
HashMap<Character, Integer> hashMap = new HashMap<>();
for(int i=0;i<magazine.length();i++){
hashMap.put(magazine.charAt(i),hashMap.getOrDefault(magazine.charAt(i),0)+1);
}
for(int j=0;j<ransomNote.length();j++){
if(hashMap.containsKey(ransomNote.charAt(j)) && hashMap.getOrDefault(ransomNote.charAt(j),0) >0){
hashMap.put(ransomNote.charAt(j),hashMap.getOrDefault(ransomNote.charAt(j),0)-1);
}else {
return false;
}
}
return true;
}
二、利用字符相减来做存储
减少了计算时间,复杂度上差不多
public boolean canConstruct(String ransomNote, String magazine) {
if(ransomNote.length()>magazine.length()){
return false;
}
int[] cnt = new int[26];
for(char c : magazine.toCharArray()){
cnt[c - 'a'] ++;
}
for(char c : ransomNote.toCharArray()){
cnt[c - 'a'] --;
if(cnt[c - 'a'] < 0) {
return false;
}
}
return true;
}
题目二、有效的字母异位词
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
来源:力扣(LeetCode)
原理类似上面的题目
public boolean isAnagram(String s, String t) {
if (s.length() != t.length()) {
return false;
}
int[] cnt = new int[26];
for (char c : s.toCharArray()) {
cnt[c - 'a']++;
}
for (char c : t.toCharArray()) {
cnt[c - 'a']--;
}
for (int c : cnt) {
if (c != 0) {
return false;
}
}
return true;
}