如何判断一个字符串是否包含另一个字符串的所有字符(考虑字符频次)

发布时间 - 2026-01-11 00:00:00    点击率:

本文介绍一种准确判断字符串a是否包含字符串b中所有字符(含重复字符)的java实现方法,核心在于维护字符频次而非简单存在性检查,避免因忽略重复字符导致误判。

在字符串匹配场景中,仅检查“字符是否存在”是不够的——例如 word1 = "12345++" 和 word2 = "155",虽然 '5' 在 word1 中只出现一次,但 word2 要求两个 '5',此时应返回 false。原始实现使用 String.contains() 逐字符判断,却未考虑字符数量限制,因此会错误地将 "155" 判定为可用。

正确的思路是:将 word1 视为一个可消耗的字符资源池,每匹配 word2 中的一个字符,就从池中移除一个对应实例。这样能天然保证频次约束。

推荐解法是使用 ArrayList 存储 word1 的全部字符,并利用 List.remove(Object) 方法的语义:它仅移除第一个匹配项,且返回 true 当且仅当移除成功(即该字符当时存在于列表中)。这恰好满足“一次一用”的需求。

以下是完整、健壮的实现:

import java.util.*;

public static boolean isItemUsable2(String word1, String word2) {
    // 边界处理:空字符串逻辑
    if (word2 == null || word2.isEmpty()) return true;
    if (word1 == null) return false;

    // 构建可修改的字符池
    List word1Chars = new ArrayList<>();
    for (char c : word1.toCharArray()) {
        word1Chars.add(c);
    }

    // 逐个尝试消耗 word2 中的字符
    for (int i = 0; i < word2.length(); i++) {
        char target = word2.charAt(i);
        // remove() 返回 true 表示成功移除一个匹配字符
        if (!word1Chars.remove((Character) target)) {
            return false; // 字符不足,立即失败
        }
    }
    return true;
}

关键优势

  • 时间复杂度可控(平均 O(m×n),其中 m=word1.length, n=word2.length),适用于中小规模字符串;
  • 逻辑清晰,无需手动计数或排序;
  • 自动处理空字符串、null 等边界情况(已补充)。

⚠️ 注意事项

  • List.remove(Object) 依赖 equals(),务必强制转型为 Character(否则会误调 remove(int index) 重载);
  • 若对性能有极高要求(如超长字符串),可升级为 HashMap 统计频次,将时间复杂度优化至 O(m + n);
  • 该方法区分大小写且不忽略空白符,如需忽略空格或转小写,应在预处理阶段统一转换。

总结:解决“含重复字符的子集判定”问题,本质是模拟资源分配过程。使用动态可变的字符列表,配合精准的单次移除语义,即可简洁、正确地实现频次敏感的包含性校验。


# word  # java  # ai  # java实现 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: bing浏览器学术搜索入口_bing学术文献检索地址  Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知  网易LOFTER官网链接 老福特网页版登录地址  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  Laravel如何实现API版本控制_Laravel版本化API设计方案  怎么用AI帮你为初创公司进行市场定位分析?  简历没回改:利用AI润色让你的文字更专业  如何解决hover在ie6中的兼容性问题  Linux系统命令中tree命令详解  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧  高端云建站费用究竟需要多少预算?  google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤  javascript中的try catch异常捕获机制用法分析  EditPlus中的正则表达式 实战(4)  Swift中swift中的switch 语句  如何在景安云服务器上绑定域名并配置虚拟主机?  黑客入侵网站服务器的常见手法有哪些?  Laravel如何使用Gate和Policy进行授权?(权限控制)  如何用wdcp快速搭建高效网站?  如何在服务器上三步完成建站并提升流量?  Laravel怎么清理缓存_Laravel optimize clear命令详解  Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程  魔毅自助建站系统:模板定制与SEO优化一键生成指南  Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程  如何快速搭建高效可靠的建站解决方案?  Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  微信小程序 配置文件详细介绍  EditPlus中的正则表达式 实战(1)  Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】  DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解  Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】  Android okhttputils现在进度显示实例代码  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何快速选择适合个人网站的云服务器配置?  微信推文制作网站有哪些,怎么做微信推文,急?  如何快速搭建FTP站点实现文件共享?  Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧  Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程  如何打造高效商业网站?建站目的决定转化率  Laravel如何使用Telescope进行调试?(安装和使用教程)  ,交易猫的商品怎么发布到网站上去?  如何快速配置高效服务器建站软件?  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  googleplay官方入口在哪里_Google Play官方商店快速入口指南  EditPlus中的正则表达式 实战(2)