问题描述:
Given two stings ransomNote and magazine, return true if ransomNote can be constructed from magazine and false otherwise.
Each letter in magazine can only be used once in ransomNote.
判断magazine中的元素能否构成ransomNote。
思路:
暴力算法:
class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
StringBuilder sb = new StringBuilder(magazine);
for (int i=0; i<ransomNote.length(); i++){
char this_char = ransomNote.charAt(i);
for (int j=0; j<sb.length(); j++){
if (sb.charAt(j)==this_char){
sb.deleteCharAt(j);
break;
}
if (j==sb.length()-1) return false;
}
}
return true;
}
}
时间复杂度: O(mn), m是ransomNote的长度, n是magazine的长度
二刷用哈希表:
class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
Map<Character, Integer> map=new HashMap<>();
for(int i=0; i<magazine.length(); i++){
if(!map.containsKey(magazine.charAt(i))){
map.put(magazine.charAt(i),1);
}
else{
map.put(magazine.charAt(i), map.get(magazine.charAt(i))+1);
}
}
for(int i=0; i<ransomNote.length(); i++){
if(!map.containsKey(ransomNote.charAt(i))){
return false;
}
else if (map.get(ransomNote.charAt(i))==0){
return false;
}
else{
map.put(ransomNote.charAt(i), map.get(ransomNote.charAt(i))-1);
}
}
return true;
}
}
时间复杂度:O(n), n为magazine的长度