给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。
如果可以,返回 true ;否则返回 false 。
magazine 中的每个字符只能在 ransomNote 中使用一次。
示例 1:
输入:ransomNote = "a", magazine = "b"
输出:false
示例 2:
输入:ransomNote = "aa", magazine = "aab" 输出:true
解法一:利用哈希表存字符串A中字符出现的次数,然后遍历B字符中的字符。最后如果哈希表中字符的键有小于0的,则要返回false.
public boolean canConstruct(String ransomNote, String magazine) {
Map<Character,Integer> m = new HashMap<Character,Integer>();
if(magazine.length()<ransomNote.length())
return false;
for(int i=0;i<magazine.length();i++)
{
char ch = magazine.charAt(i);
m.put(ch,m.getOrDefault(ch,0)+1);
}
for(int i=0;i<ransomNote.length();i++)
{
char ch = ransomNote.charAt(i);
if(m.containsKey(ch))
{
if(m.get(ch)-1<0)
return false;
m.put(ch,(int)m.get(ch)-1);
}
else
{
return false;
}
}
return true;
}
解法二:
第一次遍历用一个数组来存字符串A中出现字母的次数,第二次遍历将字符串B中的字符,如果出现就减一。如果数组中出现小于0的次数,说明A不能构成B。
public boolean canConstruct(String ransomNote, String magazine) {
int m=magazine.length(),r=ransomNote.length();
if(m<r)
return false;
int[] a = new int[26];
for(int i=0;i<m;i++)
{
a[magazine.charAt(i)-'a']++;
}
for(int i=0;i<r;i++)
{
a[ransomNote.charAt(i)-'a']--;
if(a[ransomNote.charAt(i)-'a']<0)
return false;
}
return true;
}