给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。
如果可以,返回 true ;否则返回 false 。
magazine 中的每个字符只能在 ransomNote 中使用一次。
示例 1:
输入:ransomNote = "a", magazine = "b"
输出:false
示例 2:输入:ransomNote = "aa", magazine = "ab"
输出:false
示例 3:输入:ransomNote = "aa", magazine = "aab"
输出:true来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/ransom-note
第一次解答
class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
String[] ransomNoteArr = ransomNote.split("");
String[] magazineArr = magazine.split("");
boolean flag = false;
for(int i=0 ;i<ransomNoteArr.length;i++){
for(int j =0 ;j<magazineArr.length;j++){
flag = false;
if(ransomNoteArr[i].equals(magazineArr[j])){
magazineArr[j]= null;
flag = true;
break;
}
}
if(flag==false){
return false;
}
}
return flag;
}
}
虽然过了,但是用了30多ms
于是改进,使用HashMap
class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
if(magazine.length()<ransomNote.length()) return false;
HashMap<Character,Integer> magazineMap = new HashMap<>();
for(int i =0;i<magazine.length();i++){
if(magazineMap.containsKey(magazine.charAt(i))){
//存在
int count = magazineMap.get(magazine.charAt(i))+1;
magazineMap.put(magazine.charAt(i),count);
}else{
//不存在
magazineMap.put(magazine.charAt(i),1);
}
}
boolean flag = false;
for(int i = 0;i<ransomNote.length();i++){
for (Map.Entry<Character, Integer> entry : magazineMap.entrySet()) {
flag=false;
if(((Character)ransomNote.charAt(i)).equals(entry.getKey())){
if(magazineMap.get(ransomNote.charAt(i))==0) {
return false;
}
magazineMap.put(ransomNote.charAt(i),magazineMap.get(ransomNote.charAt(i))-1);
flag=true;
break;
}
}
if(!flag){
return false;
}
}
return flag;
}
}
执行用时:14 ms, 在所有 Java 提交中击败了16.07%的用户
内存消耗:41.8 MB, 在所有 Java 提交中击败了53.14%的用户
通过测试用例:128 / 128
唉,才16%
下次再改进