如何判断一个字符串是否包含另一个字符串的所有字符(考虑字符频次)
发布时间 - 2026-01-11 00:00:00 点击率:次本文介绍一种准确判断字符串a是否包含字符串b中所有字符(含重复字符)的java实现方法,核心在于维护字符频次而非简单存在性检查,避免因忽略重复字符导致误判。
在字符串匹配场景中,仅检查“字符是否存在”是不够的——例如 word1 = "12345++" 和 word2 = "155",虽然 '5' 在 word1 中只出现一次,但 word2 要求两个 '5',此时应返回 false。原始实现使用 String.contains() 逐字符判断,却未考虑字符数量限制,因此会错误地将 "155" 判定为可用。
正确的思路是:将 word1 视为一个可消耗的字符资源池,每匹配 word2 中的一个字符,就从池中移除一个对应实例。这样能天然保证频次约束。
推荐解法是使用 ArrayList
以下是完整、健壮的实现:
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.leng
th(); 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); - 该方法区分大小写且不忽略空白符,如需忽略空格或转小写,应在预处理阶段统一转换。
总结:解决“含重复字符的子集判定”问题,本质是模拟资源分配过程。使用动态可变的字符列表,配合精准的单次移除语义,即可简洁、正确地实现频次敏感的包含性校验。
相关栏目:
【
网站优化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)


th(); i++) {
char target = word2.charAt(i);
// remove() 返回 true 表示成功移除一个匹配字符
if (!word1Chars.remove((Character) target)) {
return false; // 字符不足,立即失败
}
}
return true;
}