力扣 383 赎金信

本文解析了如何使用 Java 实现 LeetCode 问题,通过统计字符串 'magazine' 中字符频率,检查是否能用其构造 'ransomNote'。核心在于维护一个字符计数数组,对比两个字符串并更新频次。
摘要由CSDN通过智能技术生成


题目链接

https://leetcode-cn.com/problems/ransom-note/

源代码 github 地址

https://github.com/YIMEng-0/DataStructure

1、题目要求

https://leetcode-cn.com/problems/ransom-note/

简单理解就是:给定两个字符串,分析能不能使用第二个字符串组成第一个字符串;

2、思路分析

将第二个字符串的每一个字符放置在大小为 26 的数组中,数组保存的是第二个字符串中每一个字符出现的频数;
遍历第一个字符串,找出来第一个字符串中每一个字符,取出来的字符在上面创建的数组中的频次中做减法;

3、执行代码 Java

class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        // 将 magazine 里面的元素分别存储在一个数组中进行维护
        // 因为存在 26 个英文字母,所以维护这个数组即可
        int[] save = new int[26];

        // 将 magazine 的元素进行一一放置进去
        for (int i = 0; i < magazine.length();i++) {
            int temp = magazine.charAt(i) - 'a';
            // 一一进行保存
            save[temp] = save[temp] + 1;
        }

        // 将 ransomNote 里面的每一个字符在上面保存 magazine 里面的数组中减去存在的元素
        for(int i = 0; i < ransomNote.length(); i++) {
            int temp = ransomNote.charAt(i) - 'a';
            if(save[temp] > 0) {
                save[temp] = save[temp] - 1;
            } else {
                return false;
            }
        }
        
        return true;
    }
}

4、问题反思

4.1、理解 save[temp] = save[temp] + 1;

sava[temp] 是数组中保存的元素,相同的字符出现多次的时候,这个用来记录出现的频次;

4.2、理解 if(save[temp] > 0)

当 sava[temp] = 0 的时候,说明使用第二个字符串创建的 sava 数组中没有构成第一个字符串的元素了,这个时候就是返回 false 所以临界条件只能是 sava[temp] > 0;

5、小结

通过使用一个大小为 26 的数组,统计 magazine 里面的每个字符出现的频次;再遍历字符串 ransomNote 在统计字符出现的频次中做减法操作,可以使得比较快速的判断,能否使用第二个字符串来构成第一个字符串;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值