贖金信
題目描述:給定一個贖金信 (ransom) 字串和一個雜誌(magazine)字串,判斷第一個字串 ransom 能不能由第二個字串 magazines 裡面的字元構成。如果可以構成,返回 true ;否則返回 false。
(題目說明:為了不暴露贖金信字跡,要從雜誌上搜尋各個需要的字母,組成單詞來表達意思。雜誌字串中的每個字元只能在贖金信字串中使用一次。)
示例說明請見LeetCode官網。
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/probl...
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
解法一:遍歷字串
首先宣告一個Map為charCount來記錄ransomNote中每個字元出現的次數,key為出現的字元,value為重複字元出現的次數,然後遍歷ransomNote來初始化 ransomNote 的字元出現次數;然後遍歷magazine中的每一個字元,將Map還存在的字元減掉,最後遍歷完成後,如果charCount為空,說明字串 ransom 能由第二個字串 magazines 裡面的字元構成,返回true;否則,返回false。
import java.util.HashMap;
import java.util.Map;
public class LeetCode_383 {
public static boolean canConstruct(String ransomNote, String magazine) {
Map<Character, Integer> charCount = new HashMap<>();
// 初始化 ransomNote 的字元出現次數
for (char c : ransomNote.toCharArray()) {
if (charCount.containsKey(c)) {
charCount.put(c, charCount.get(c) + 1);
} else {
charCount.put(c, 1);
}
}
// 判斷 magazine 中是否有字元可以組成 ransomNote
for (char c : magazine.toCharArray()) {
if (charCount.containsKey(c)) {
if (charCount.get(c) > 1) {
charCount.put(c, charCount.get(c) - 1);
} else {
charCount.remove(c);
}
}
}
if (charCount.isEmpty()) {
return true;
} else {
return false;
}
}
public static void main(String[] args) {
System.out.println(canConstruct("aa", "aab"));
}
}
【每日寄語】 不怕“難”字當道,就怕“懶”字沾身。