当前位置: 首页 > article >正文

判断一个字符串能否被另外一个字符串中的元素构成

给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以,返回 true ;否则返回 false 。 magazine 中的每个字符只能在 ransomNote 中使用一次。(字符串只能由字母构成,且长度均大于0)

以下是几种判断 ransomNote 能否由 magazine 里面的字符构成的 Java 实现方法:

方法一:使用数组统计字符频率

由于字符串只包含小写字母,因此可以使用一个长度为 26 的数组来统计每个字符的出现次数。

public class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        // 因为只包含小写字母,创建一个长度为 26 的数组来统计字符频率
        int[] charCount = new int[26];

        // 统计 magazine 中每个字符的出现次数
        for (char c : magazine.toCharArray()) {
            charCount[c - 'a']++;
        }

        // 检查 ransomNote 中的字符是否都能在 magazine 中找到
        for (char c : ransomNote.toCharArray()) {
            if (--charCount[c - 'a'] < 0) {
                return false;
            }
        }

        return true;
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        String ransomNote = "a";
        String magazine = "b";
        System.out.println(solution.canConstruct(ransomNote, magazine)); 
    }
}

复杂度分析

  • 时间复杂度:,其中  是 ransomNote 的长度, 是 magazine 的长度。需要分别遍历两个字符串。
  • 空间复杂度:,因为只使用了一个长度为 26 的数组,额外空间是常数级的。

方法二:使用 HashMap 统计字符频率

使用 HashMap 来统计字符的出现次数,适用于字符串包含更多种类字符的情况。

import java.util.HashMap;
import java.util.Map;

public class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        // 创建一个 HashMap 来统计 magazine 中每个字符的出现次数
        Map<Character, Integer> charCount = new HashMap<>();

        // 统计 magazine 中每个字符的出现次数
        for (char c : magazine.toCharArray()) {
            charCount.put(c, charCount.getOrDefault(c, 0) + 1);
        }

        // 检查 ransomNote 中的字符是否都能在 magazine 中找到
        for (char c : ransomNote.toCharArray()) {
            if (!charCount.containsKey(c) || charCount.get(c) == 0) {
                return false;
            }
            charCount.put(c, charCount.get(c) - 1);
        }

        return true;
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        String ransomNote = "aa";
        String magazine = "ab";
        System.out.println(solution.canConstruct(ransomNote, magazine)); 
    }
}

复杂度分析

  • 时间复杂度:,同样需要分别遍历两个字符串。
  • 空间复杂度:,其中  是 magazine 中不同字符的数量。在最坏情况下,所有字符都不同, 最大为字符串的长度。

方法三:暴力解法

对于 ransomNote 中的每个字符,在 magazine 中查找并标记已使用的字符。

public class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        char[] magazineChars = magazine.toCharArray();

        for (char c : ransomNote.toCharArray()) {
            boolean found = false;
            for (int i = 0; i < magazineChars.length; i++) {
                if (magazineChars[i] == c) {
                    // 标记该字符已使用
                    magazineChars[i] = ' ';
                    found = true;
                    break;
                }
            }
            if (!found) {
                return false;
            }
        }

        return true;
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        String ransomNote = "a";
        String magazine = "b";
        System.out.println(solution.canConstruct(ransomNote, magazine)); 
    }
}

 复杂度分析

  • 时间复杂度:,其中  是 ransomNote 的长度, 是 magazine 的长度。对于 ransomNote 中的每个字符,都需要在 magazine 中进行查找。
  • 空间复杂度:,因为创建了一个与 magazine 长度相同的字符数组。

 


http://www.kler.cn/a/522590.html

相关文章:

  • 项目部署(springboot项目)
  • JVM--类加载器
  • [权限提升] Windows 提权 — 系统内核溢出漏洞提权
  • 力扣【669. 修剪二叉搜索树】Java题解
  • PWM频率测量方法
  • mybatis(112/134)
  • 字母与音标
  • c++贪心
  • 【1】阿里面试题整理
  • Linux网络 应用层协议 HTTP
  • 选择困难?直接生成pynput快捷键字符串
  • 代码随想录算法训练营day29(0123)
  • vue页面,绘制项目的计划进度和实际进度;展示不同阶段示意图
  • 07JavaWeb——Mysql02
  • 02-硬件入门学习/嵌入式教程-Type-C使用教程
  • 【读书笔记】万字浅析游戏场景中常见的渲染性能优化手段
  • 学到一些小知识关于Maven 与 logback 与 jpa 日志
  • 探索Baklib企业内容管理系统CMS优化企业文档管理的最佳实践
  • 【华为OD-E卷 - 基站维修工程师 100分(python、java、c++、js、c)】
  • Swoole的MySQL连接池实现
  • ResNeSt: Split-Attention Networks 参考论文
  • 用layui表单,前端页面的样式正常显示,但是表格内无数据显示(数据库连接和获取数据无问题)——已经解决
  • 动手学图神经网络(6):利用图神经网络进行点云分类
  • 期权帮|做空股指期货是否会对股指产生影响?
  • 深入学习Java的线程的生命周期
  • 【快速上手】阿里云百炼大模型