LeetCode:Ransom Note_383

Posted 子烁爱学习

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode:Ransom Note_383相关的知识,希望对你有一定的参考价值。

LeetCode:Ransom Note

【问题再现】

Given? an ?arbitrary? ransom? note? string ?and ?another ?string ?containing ?letters from? all ?the ?magazines,? write ?a ?function ?that ?will ?return ?true ?if ?the ?ransom ? note ?can ?be ?constructed ?from ?the ?magazines ; ?otherwise, ?it ?will ?return ?false. ??

Each ?letter? in? the? magazine ?string ?can? only ?be? used ?once? in? your ?ransom? note.

Note:
You may assume that both strings contain only lowercase letters.

canConstruct("a", "b") -> false
canConstruct("aa", "ab") -> false
canConstruct("aa", "aab") -> true

【优质算法】

public class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        int[] arr = new int[26];
        for (int i = 0; i < magazine.length(); i++) {
            arr[magazine.charAt(i) - ‘a‘]++;
        }
        for (int i = 0; i < ransomNote.length(); i++) {
            if(--arr[ransomNote.charAt(i)-‘a‘] < 0) {
                return false;
            }
        }
        return true;
    }
}

【题后反思】

  本题用到了统计字符出现频率的数组计数器,这种实现最为简单,不做解释。

  我做这道题的时候考虑了magazine要按照Ransom的顺序,结果一直通不过,把问题想的复杂化了。

    public static boolean canConstruct(String ransomNote, String magazine) {
        int Sp = 0;
        int Lp = 0;
        int count = 0;

        while (Lp < magazine.length()) {
            if(Sp==ransomNote.length())
                break;
            if (ransomNote.charAt(Sp)==magazine.charAt(Lp)) {
                count++;
                System.out.print(ransomNote.charAt(Sp));
                Sp++;
                Lp++;
            } else
                Lp++;
            }
        if (count == ransomNote.length())
            return true;
        else
            return false;

  这种题目也可以利用HashMap来计算:

  

public static boolean canConstruct(String ransomNote, String magazine) {
        HashMap<Character,Integer> myMap = new HashMap<>();
        for(int i=0;i<magazine.length();i++)
        {
            if(myMap.containsKey(magazine.charAt(i)))
                myMap.put(magazine.charAt(i),myMap.get(magazine.charAt(i))+1);
            else
                myMap.put(magazine.charAt(i),1);
        }


        for(int i=0;i<ransomNote.length();i++)
        {
            if(myMap.containsKey(ransomNote.charAt(i)))
            {
                myMap.put(ransomNote.charAt(i),myMap.get(ransomNote.charAt(i))-1);
                if(myMap.get(ransomNote.charAt(i))<=0)
                    return false;
            }
            else
                return false;
        }
        return true;
    }

 

以上是关于LeetCode:Ransom Note_383的主要内容,如果未能解决你的问题,请参考以下文章

[LeetCode] Ransom Note

*LeetCode--Ransom Note

LeetCode_383. Ransom Note

leetcode_383 Ransom Note(String)

LeetCode 383. Ransom Note

LeetCode(383)Ransom Note