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;
    }
原文地址:https://www.cnblogs.com/MrSaver/p/5904230.html