力扣 383 赎金信


题目链接

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 在统计字符出现的频次中做减法操作,可以使得比较快速的判断,能否使用第二个字符串来构成第一个字符串;

posted @   YIMENG-0  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示