leetcode(85).383. Ransom Note

题意:

给定两个小写字母构成的字符串,判断前者是否能由后者字符串中的字母组成,而且每个出现在后者中的字母只能在前者中出现一次(一一匹配)。

初步分析:

就是说前者字符串中的所有字母后者字符串中都要有,而且数目还必须等于或者大于前者。

用map存储前者每个字母有多少个,然后遍历后者,对于map中有的(前者字符串有的),就将map中value值减1

最后如果不存在value值大于0的,返回真(代表前者字符串的字母都被后者匹配完了),否则返回假

public class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        HashMap<Character, Integer> hm = new HashMap<>();
        for(int i=0; i<ransomNote.length(); i++)
        {
            if(!hm.containsKey(ransomNote.charAt(i)))
                hm.put(ransomNote.charAt(i),1);
            else
                hm.put(ransomNote.charAt(i),hm.get(ransomNote.charAt(i))+1);
        }
        for(int i=0; i<magazine.length(); i++)
        {
            if(hm.containsKey(magazine.charAt(i)))
                hm.put(magazine.charAt(i),hm.get(magazine.charAt(i))-1);
        }
        for (Map.Entry<Character, Integer> entry : hm.entrySet())
        {
            if(entry.getValue() > 0)
                return false;
        }
        return true;
    }
}


其实用角标和角标对应值来描述关系,也就是说,用数组来当做map用是常有的事,所以,参看这种解法:

public boolean canConstruct(String ransomNote, String magazine) {
    int[] table = new int[128];
    for (char c : magazine.toCharArray())   
         table[c]++;
    for (char c : ransomNote.toCharArray())
        if (--table[c] < 0) 
             return false;
    return true;
}
意思一样的,这样更方便

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值