LeetCode——383.赎金信

通过万岁!!!

  • 题目:简单的理解,就是给你两个字符串,看第一个字符串的字符能不能由第二个的字符串中的字符拼接形成,不能重复使用,但是可以多。例如第一个是abb,第二个是aab,那就不行。第二个必须包含两个b一个a。
  • 思路:两次遍历,第一个记录我们有的资源,第二次遍历目标,每次用一个就–;
  • 技巧:用int数组去存储,当然可以用map,但是map相比较起来比较麻烦,并且题目中说了26个小写字母。如果是没有说的话,那最好用map。

伪代码

定义数组,长度为26。
for 遍历第二个字符串
    每次遍历到一个字符,就在对应的下标的位置进行++
for 遍历第一个字符串
    如果数组中的内容是0了
        return false;
    否则
        对应的数组的值--;
return true;

java代码

class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        int sign[] = new int[26];
        for (int i = 0; i < magazine.length(); i++)
            sign[magazine.charAt(i) - 97]++;
        for (int i = 0; i < ransomNote.length(); i++)
            if (sign[ransomNote.charAt(i) - 97] == 0) return false;
            else sign[ransomNote.charAt(i) - 97]--;
        return true;
    }
}
  • 总结:没有什么难度,这个就是按照基本思路来就可以了。这里主要是注意什么时候用map,一般如果不知道需要多长的数组的时候,用map。但是这里知道了,所以用数组会更好,并且这里定义的数组一般是顺序的,所以查找的速度也是很快的。map的是数组加红黑树,其实查找起来还是有点复杂度。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值