Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
Java教程:高效处理字符串去重与共享字符计数_创想鸟

Java教程:高效处理字符串去重与共享字符计数

java教程:高效处理字符串去重与共享字符计数

本文详细阐述了如何在Java中对给定字符串和字符串数组进行字符去重处理,并进一步统计数组中每个去重字符串与主去重字符串之间共享的独立字符数量。通过引入高效的辅助函数和数据结构,本教程提供了一种结构清晰、性能优化的解决方案,旨在帮助开发者有效处理此类字符串操作。

1. 问题概述

在许多文本处理场景中,我们可能需要对字符串进行字符去重,并在此基础上进行比较。具体来说,本教程将解决以下问题:给定一个目标字符串 B 和一个字符串数组 A,我们需要完成三个主要任务:

对目标字符串 B 进行字符去重,得到一个只包含唯一字符的新字符串。对字符串数组 A 中的每个元素也进行字符去重,生成一个由去重字符串组成的新数组。遍历去重后的数组 A 中的每个字符串,统计其中有多少个独立的字符同时存在于去重后的目标字符串 B 中。最终结果应是一个整数数组,其元素顺序与原始数组 A 保持一致,记录了每个对应位置的共享字符数量。

例如,如果 B = “iyee” 且 A = [“hi”, “bye”, “bebe”]:

去重 B 得到 “iye”。去重 A 中的元素得到 [“hi”, “bye”, “be”]。对于 “hi”,它与 “iye” 共享的独立字符是 ‘i’ (1个)。对于 “bye”,它与 “iye” 共享的独立字符是 ‘y’, ‘e’ (2个)。对于 “be”,它与 “iye” 共享的独立字符是 ‘e’ (1个)。最终输出应为 [1, 2, 1]。

2. 核心思路与实现方法

为了高效地解决上述问题,我们可以将整个过程分解为两个主要部分:一个通用的字符串字符去重函数,以及一个利用该函数进行主逻辑处理的函数。

2.1 字符串字符去重函数 dist(String s)

这个辅助函数负责接收一个字符串,并返回其去重后的版本。实现去重最有效的方法之一是利用 HashSet 的特性:HashSet 不允许存储重复元素。我们可以遍历输入字符串的每个字符,尝试将其添加到 HashSet 中。如果 add() 方法返回 true,则表示该字符是首次出现,我们将其添加到 StringBuilder 中以构建去重后的字符串。

立即学习“Java免费学习笔记(深入)”;

实现步骤:

怪兽AI数字人 怪兽AI数字人

数字人短视频创作,数字人直播,实时驱动数字人

怪兽AI数字人 44 查看详情 怪兽AI数字人 创建一个 StringBuilder 用于构建去重后的字符串。创建一个 HashSet 用于记录已遇到的字符。遍历输入字符串的每一个字符。对于每个字符,尝试将其添加到 HashSet。如果添加成功(即 set.add(char) 返回 true),说明该字符是第一次出现,将其追加到 StringBuilder 中。最终返回 StringBuilder 转换成的字符串。

2.2 主处理函数 mathProfessor(String b, String[] a)

主函数将协调调用 dist 函数,并执行最终的字符计数逻辑。

实现步骤:

首先,对目标字符串 b 调用 dist 函数进行去重,得到 distinctB。创建一个 String 数组 distinctA,用于存储数组 a 中每个元素去重后的字符串。遍历原始字符串数组 a,对每个元素调用 dist 函数,并将结果存储到 distinctA 中。创建一个 int 数组 countArr,用于存储最终的计数结果,其长度与原始数组 a 相同。初始化一个计数器 count 为 0。遍历 distinctA 数组中的每一个去重字符串 sFromA。对于每个 sFromA,再次遍历去重后的目标字符串 distinctB 的每一个字符 charFromB。检查 sFromA 是否包含 charFromB。如果包含,则 count 加 1。内层循环结束后,将当前的 count 值存储到 countArr 的对应位置。重置 count 为 0,为下一个 sFromA 的计数做准备。返回 countArr。

3. 示例代码实现

以下是基于上述思路的完整Java代码实现:

import java.util.HashSet;import java.util.Set;import java.util.Arrays; // 仅用于测试打印结果public class DistinctCharacterProcessor {    /**     * 对给定字符串进行字符去重,返回只包含唯一字符的新字符串。     * 例如:"iyee" -> "iye"     *     * @param s 待去重的字符串     * @return 去重后的字符串     */    public static String dist(String s) {        StringBuilder sb = new StringBuilder();        Set set = new HashSet(); // 使用HashSet记录已遇到的字符        for (int i = 0; i < s.length(); i++) {            char c = s.charAt(i);            if (set.add(c)) { // 如果字符是第一次添加到Set中 (即是唯一的)                sb.append(c); // 则将其追加到StringBuilder            }        }        return sb.toString();    }    /**     * 处理字符串数组,统计每个去重元素与主去重字符串共享的独立字符数量。     *     * @param b 主字符串     * @param a 字符串数组     * @return 一个整数数组,包含每个数组元素与主字符串共享的独立字符数量     */    public static int[] mathProfessor(String b, String[] a) {        // 1. 对主字符串进行去重        String distinctB = dist(b);        // 2. 存储数组a中每个元素去重后的字符串        String[] distinctA = new String[a.length];        for (int i = 0; i < a.length; i++) {            distinctA[i] = dist(a[i]);        }        // 3. 统计共享字符数量        int[] countArr = new int[a.length];        int count = 0; // 临时计数器        for (int i = 0; i < distinctA.length; i++) {            String sFromA = distinctA[i];            for (int j = 0; j aple, banana->ban, orange->orng, grape->grap. ban共享a, orng共享e, grap共享a,p)    }}

4. 代码解析与注意事项

4.1 dist 函数详解

Set set = new HashSet();: HashSet 提供了近乎常数时间 O(1) 的 add 和 contains 操作(平均情况),这使得字符去重非常高效。当处理大量字符或长字符串时,其性能优势尤为明显。if (set.add(c)): add 方法在元素成功添加到 Set 中时返回 true,如果元素已存在于 Set 中(即重复),则返回 false。我们利用这一特性来判断字符是否是唯一的。StringBuilder: 相较于直接使用 String 进行字符串拼接(+ 操作),StringBuilder 在循环中进行大量字符串修改时效率更高,因为它避免了创建大量的中间 String 对象。

4.2 mathProfessor 函数详解

两次调用 dist: 首先对主字符串 b 调用 dist,然后在一个循环中对数组 a 的每个元素调用 dist。这是确保所有比较都基于去重字符的关键。嵌套循环进行计数: 外层循环遍历 distinctA 中的每个去重字符串,内层循环遍历 distinctB 中的每个字符。sFromA.contains(Character.toString(distinctB.charAt(j))): 这一行是进行字符匹配的核心。它检查 distinctA 中的当前字符串是否包含 distinctB 中的某个特定字符。需要注意的是,contains 方法的参数是 CharSequence,所以我们需要将 char 类型转换为 String (Character.toString(char))。计数器重置: count = 0; 在每次处理完 distinctA 中的一个元素后,必须将计数器重置,以确保下一个元素的计数从零开始。

4.3 性能考量

dist 函数的时间复杂度大致为 O(N),其中 N 是输入字符串的长度,因为每个字符都被遍历一次并进行 HashSet 操作。mathProfessor 函数中,对 b 和 a 数组中每个字符串调用 dist 的总时间复杂度取决于所有字符串的总长度。最后的嵌套循环部分,外层循环执行 distinctA.length 次,内层循环执行 distinctB.length() 次。sFromA.contains() 操作在最坏情况下可能需要 O(M) 时间(M 是 sFromA 的长度)。因此,这部分的总时间复杂度大致为 O(distinctA.length * distinctB.length() * avgLengthOfDistinctAString)。对于常见的字符集和字符串长度,这种方法通常是高效且实用的。

5. 总结

本教程提供了一种清晰且高效的Java解决方案,用于处理字符串去重以及统计共享独立字符的问题。通过将字符串去重逻辑封装在独立的 dist 辅助函数中,我们提高了代码的模块化和复用性。在主函数 mathProfessor 中,我们系统地应用了去重逻辑,并利用嵌套循环完成了字符匹配和计数。HashSet 的使用是提高去重效率的关键,而 StringBuilder 则优化了字符串构建过程。理解这些核心概念和实现细节,将有助于开发者在面对类似字符串处理任务时,设计出健壮且高性能的解决方案。

以上就是Java教程:高效处理字符串去重与共享字符计数的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/326062.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
edge浏览器如何使用沉浸式阅读器模式_Edge浏览器沉浸式阅读器使用方法
上一篇 2025年11月5日 12:04:20
如何用Java实现图形界面记账软件
下一篇 2025年11月5日 12:04:41

相关推荐

  • 番茄小说怎么清除浏览记录_番茄小说浏览记录清除操作教程

    可通过应用内设置一键清空浏览记录,或左滑删除特定书籍历史;也可通过手机设置清除缓存或数据来彻底移除阅读痕迹。 如果您在使用番茄小说时希望保护个人隐私,避免他人查看您的阅读历史,可以通过以下方法清除浏览记录。以下是具体的操作步骤: 一、通过应用内设置清除浏览记录 番茄小说提供了内置的清除功能,用户可以…

    2026年9月23日
    700
  • 如何用PhotoPosPro的AI裁剪图片?快速实现智能裁剪的教程

    PhotoPosPro的AI裁剪功能可自动识别图片主体并裁剪边缘,适合快速处理或构图新手。打开图片后,在“Image”或“Tools”菜单中找到“AI Crop”工具,可选裁剪比例或让软件自动判断,点击“Apply”运行AI裁剪。完成后可手动微调裁剪框,满意后保存。若效果不佳,可尝试手动调整、切换A…

    2026年9月23日
    200
  • 为什么Java中构造方法重要 如何正确编写构造方法

    构造方法确保对象正确初始化:通过强制赋初值、校验数据、支持封装和重载提升灵活性;编写时需遵循命名一致、无返回类型、合理用参、注意访问修饰符、避免复杂逻辑及善用this()调用;常见误区包括忽略无参构造、过度初始化和异常处理不当。 构造方法在Java中扮演着初始化对象的关键角色。创建对象时,构造方法会…

    2026年9月23日
    000
  • VS Code团队协作:共享配置与规范

    通过共享VS Code配置实现团队协作标准化,1. 使用.settings.json统一编辑器行为;2. 集成Prettier与ESLint确保代码风格一致;3. 通过extensions.json推荐必备插件;4. 忽略私有配置文件避免冲突,提升开发效率。 在团队开发中,保持代码风格一致和开发环境…

    2026年9月23日
    000
  • 苹果官网正版查询系统 iPhone序列号验证正品平台

    苹果官网正品查询入口为https://checkcoverage.apple.com/cn/zh/,输入序列号可验证设备型号、保修状态、购买方式及激活锁等信息,确保设备真实性与安全性。 苹果官网正版查询系统 iPhone序列号验证正品平台在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来苹果…

    2026年9月23日
    000
  • Prestashop分类描述在分页时的显示行为解析与SEO考量

    Prestashop商店中,分类描述通常仅在首个分页页面显示,而在后续分页页面上消失,甚至从第二页返回第一页时也可能不显示。这并非一个技术故障,而是Prestashop的默认行为,且从SEO角度看,只要描述在直接访问的第一页可见,就已满足核心要求,无需在所有分页页面重复显示,以避免潜在的重复内容问题…

    2026年9月23日
    100
  • 手把手教你在 Ubuntu16.04 安装 GPU 驱动 + CUDA9.0 + cuDNN7

    手把手教你在 Ubuntu16.04 安装 GPU 驱动 + CUDA9.0 + cuDNN7手把手教你在 Ubuntu16.04 安装 GPU 驱动 + CUDA9.0 + cuDNN7手把手教你在 Ubuntu16.04 安装 GPU 驱动 + CUDA9.0 + cuDNN7手把手教你在 Ubuntu16.04 安装 GPU 驱动 + CUDA9.0 + cuDNN7

    如果你的电脑上安装了 ubuntu 16.04 系统,并且配备了一块 nvidia geforce gpu 显卡,那么不利用它来运行深度学习模型就太可惜了!尽管网上有许多相关教程,但质量参差不齐。本文将详细指导你如何在 ubuntu 16.04 上安装 gpu 显卡驱动、cuda 9.0 和 cud…

    2026年9月23日 用户投稿
    000
  • Infinispan中实现并发安全计数器:解决分布式应用中的用户登录统计挑战

    本文探讨了在Infinispan缓存中实现并发安全的用户登录计数问题,当多个用户同时登录时,传统计数方式可能导致数据不一致。文章详细介绍了利用Infinispan提供的分布式计数器、事务机制和版本化操作这三种核心策略,以确保在高并发环境下数据更新的原子性和一致性,为构建健壮的分布式应用提供解决方案。…

    2026年9月23日
    200
  • 微信支付功能被限制怎么办 微信支付账户解封与操作方法

    先看通知内容,区分临时风控与长期限制。若提示24-72小时自动解除则无需操作;若需申诉,准备身份证、交易凭证、实名信息三类材料,通过“腾讯客服”小程序或95017官方渠道提交,1-3日审核,全程免费且无需联系私人账号。 微信支付被限制,别急着找人花钱解封。绝大多数情况是系统触发的安全保护,自己按官方…

    2026年9月23日
    000
  • Hibernate实体间非映射关联ID的引用与查询策略

    本文探讨了在Hibernate应用中,如何在不建立显式实体映射关系(如@ManyToOne)的情况下,实现实体间基于ID的引用和数据查询。核心方法是利用HQL/JPQL的JOIN…ON语法,通过共享的ID字段进行动态关联查询,从而简化实体模型设计,避免不必要的复杂映射,同时满足数据追踪和…

    2026年9月23日
    400
  • Java对象与引用的区别是什么 引用传递对方法调用的影响

    对象是类的实例,存储在堆中;引用是保存对象地址的变量,存储在栈或堆中。例如Person p = new Person();中,new Person()创建对象在堆中,p是引用,指向该对象。Java只有值传递:基本类型传值,引用类型传地址副本。方法参数接收引用副本,仍指向同一对象,因此可通过它修改对象…

    2026年9月23日
    800
  • WooCommerce 新订单邮件:根据运输方式设置回复邮箱

    本文介绍了如何根据 WooCommerce 订单中的运输方式,动态设置新订单邮件的回复邮箱。通过自定义 wp_mail 钩子,可以实现更精细化的邮件管理,将不同运输方式的客户咨询路由到相应的邮箱地址,提高客户服务的效率。 根据运输方式自定义 WooCommerce 新订单邮件回复邮箱 WooComm…

    2026年9月23日
    000
  • 苹果M4 Max芯片对决英特尔i9-14900K:跨架构巅峰对决,专业创作效率谁主沉浮?实测见分晓!

    M4 Max单核领先、多核微超i9-14900K,GPU与能效优势显著,尤其在Final Cut Pro等专业场景表现突出,而i9-14900K依赖强大扩展性与全平台兼容性,二者代表不同技术路线的巅峰对决。 苹果M4 Max和英特尔i9-14900K代表了两种不同的技术路线,一个专为能效与集成度优化…

    2026年9月23日
    300
  • win11指纹识别不能用了怎么办_win11指纹识别故障修复方法

    首先重新安装指纹驱动程序,进入设备管理器卸载生物识别设备后扫描硬件改动;接着可更新或回滚驱动程序,确保驱动兼容;检查Windows生物识别服务是否设为自动并已启动;删除原有指纹数据并重新录入;最后运行sfc /scannow命令修复系统文件,重启电脑测试功能。 如果您在使用Windows 11系统时…

    2026年9月23日
    400
  • 通过ALTER DATABASE修改默认字符集解决乱码

    mysql数据库出现乱码通常因字符集设置不正确,解决方法如下:1. 使用alter database修改数据库默认字符集,如utf8mb4;2. 对已有表逐个执行alter table convert to character set修改字符集;3. 修改数据库配置文件(my.cnf或my.ini)…

    2026年9月23日
    300
  • Chrome浏览器怎么查看扩展程序的ID_获取已安装扩展唯一标识符

    1、打开Chrome浏览器,输入chrome://extensions/并回车;2、开启右上角“开发者模式”,即可查看每个扩展下方显示的32位唯一ID;3、在macOS中可通过路径~/Library/Application Support/Google/Chrome/Default/Extensio…

    2026年9月23日
    200
  • KNIME的AI混合工具怎么用?创建数据工作流的详细操作步骤

    KNIME的AI混合工具是将数据处理、机器学习与深度学习通过可视化拖拽整合的平台,核心在于融合KNIME节点、Python/R脚本及外部框架,实现端到端工作流的构建与优化。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ KNIME的AI混合…

    2026年9月23日
    300
  • Laravel 表单验证失败后自动回填用户输入数据

    本教程详细讲解在 Laravel 应用中,如何优雅地处理表单验证失败场景,确保用户之前输入的数据不会丢失。通过在控制器中使用 withInput() 方法将请求数据闪存到 Session,并在 Blade 模板中使用 old() 辅助函数,实现表单字段的自动回填,显著提升用户体验。 在 Web 应用…

    2026年9月23日
    500
  • 解决Apache POI生成DOCX水印文件XML声明错误

    本文探讨了使用Apache POI为DOCX文档添加水印时,可能遇到的“XML声明必须位于输入开头”错误。该错误导致文件无法在Microsoft Word中打开,但可在浏览器查看器中正常显示。文章分析了错误原因,并提供了基于POI版本升级、XML结构理解及潜在高级解决方案的专业指导,旨在帮助开发者有…

    2026年9月23日
    1100
  • Pages怎么制作流程图 Pages使用形状绘制流程图的步骤

    使用Pages内置形状工具可轻松创建专业流程图。首先插入矩形、菱形等基本图形表示步骤与判断,通过连接线关联形成逻辑流程;接着利用智能对齐与分布功能,选中多个形状后进行左对齐或水平分布,确保布局整洁;最后为各形状添加文字说明,并设置字体、颜色及填充样式,用不同色彩区分开始、结束等节点,提升可读性与视觉…

    2026年9月23日
    200

发表回复

登录后才能评论
关注微信