每日一练 2024.9.29(2)

news2024/9/29 9:27:33

目录

解题思路与代码实现

题目分析

一、解题策略

关键步骤:

二、代码实现

三、代码解析

四、复杂度分析

五、运行示例

示例1:

示例2:

六、总结


解题思路与代码实现

题目分析

这道题目要求我们找到字符串列表 strs 中的相似字符组。两字符串相似是指,它们通过交换某些字符可以互相转化。在问题中,如果两个字符串相互相似,那么它们可以归为同一组。我们需要找出字符串列表中有多少个相似字符组。

  • 字符组的定义:通过交换某些位置的字符来形成的字符串。
  • 相似性判断:如果字符串通过交换最多两个字符的位置,可以互相转换,则它们属于同一组。

这是一个图论中的联通分量问题,可以通过并查集(Union-Find)或者深度优先搜索(DFS)来求解。


一、解题策略

本题可以通过并查集来解决。并查集是一种适合解决连通性问题的数据结构,特别适合用于合并集合和查询集合是否连通的操作。对于每个字符串,我们都需要遍历并检查它是否和列表中其他字符串相似,如果相似,就将它们合并到一个组。

  1. 初始化并查集:对于每一个字符串,将其看作是一个节点,初始化并查集。
  2. 相似性判断:对于任意两个字符串,如果它们相似,则将它们合并到同一集合。
  3. 计数连通分量:最后统计并查集中有多少个连通分量,即有多少个相似字符组。
关键步骤:
  1. 相似判断函数:用来判断两个字符串是否相似(最多两个字符不同)。
  2. 并查集的合并与查找操作

二、代码实现

 
class Solution {
    // 并查集数组
    int[] parent;

    // 查找操作
    public int find(int x) {
        if (parent[x] != x) {
            parent[x] = find(parent[x]); // 路径压缩
        }
        return parent[x];
    }

    // 合并操作
    public void union(int x, int y) {
        int rootX = find(x);
        int rootY = find(y);
        if (rootX != rootY) {
            parent[rootX] = rootY; // 合并两个集合
        }
    }

    // 判断两个字符串是否相似
    public boolean isSimilar(String a, String b) {
        int diff = 0;
        for (int i = 0; i < a.length(); i++) {
            if (a.charAt(i) != b.charAt(i)) {
                diff++;
                if (diff > 2) {  // 如果超过2个位置不同,则不相似
                    return false;
                }
            }
        }
        return true;
    }

    public int numSimilarGroups(String[] strs) {
        int n = strs.length;
        parent = new int[n];

        // 初始化并查集,每个节点是自己的父节点
        for (int i = 0; i < n; i++) {
            parent[i] = i;
        }

        // 进行合并操作
        for (int i = 0; i < n; i++) {
            for (int j = i + 1; j < n; j++) {
                if (isSimilar(strs[i], strs[j])) {
                    union(i, j);
                }
            }
        }

        // 统计连通分量的数量
        int count = 0;
        for (int i = 0; i < n; i++) {
            if (find(i) == i) {  // 如果是根节点,则表示是一个新的字符组
                count++;
            }
        }

        return count;
    }
}

三、代码解析

  1. 并查集初始化parent[i] = i,表示每个节点一开始都是独立的组,自己是自己的父节点。
  2. 相似性判断:通过遍历字符串的每个字符,统计不同字符的个数,如果超过2个字符不相同,则它们不相似。
  3. 合并集合:通过 union(i, j) 来合并两个相似的字符串。
  4. 查找连通分量:最终通过查找根节点,统计有多少个独立的组(即多少个相似字符组)。

四、复杂度分析

  • 时间复杂度

    • 并查集的初始化为 O(n),其中 n 是字符串的数量。
    • 双重循环判断字符串的相似性,复杂度为 O(n^2 * m),其中 m 是字符串的长度,因为每次比较字符串相似性需要 O(m) 的时间。
    • 合并和查找的操作接近常数时间,路径压缩可以使得查找的时间复杂度接近于 O(1)
    • 总的时间复杂度为 O(n^2 * m)
  • 空间复杂度

    • 主要空间开销是并查集的数组 parent,占用 O(n) 的空间。
    • 额外的空间开销较少,因此总的空间复杂度为 O(n)

五、运行示例

示例1:
 
输入:strs = ["tars","rats","arts","star"]
输出:2

解释

  • "tars" 和 "rats" 相似(交换1次)。
  • "rats" 和 "arts" 相似(交换1次)。
  • "arts" 和 "star" 相似(交换1次)。 所以这四个字符串形成一个相似字符组,答案是 1
示例2:
 
输入:strs = ["omv","ovm"]
输出:1

解释

  • "omv" 和 "ovm" 相似(交换1次)。 所以它们属于同一组,答案是 1

六、总结

在这道题中,我们通过并查集结构实现了对相似字符组的判断和合并操作。通过设计相似性判断函数,我们能够准确地将相似的字符串分为一组。最终,通过并查集的查找操作,统计出有多少个相似字符组。通过这种方法,我们解决了字符串相似性分组的问题,并且该算法具有较好的时间和空间效率。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2176313.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Arch - 架构安全性_验证(Verification)

文章目录 OverView导图1. 引言&#xff1a;数据验证的重要性概述2. 数据验证的基本概念3. 数据验证的层次前端验证后端验证 4. 数据验证的标准做法5. 自定义校验注解6. 校验结果的处理7. 性能考虑与副作用8. 小结 OverView 即使只限定在“软件架构设计”这个语境下&#xff0c…

物理学基础精解【40】

文章目录 矢量积矢量积&#xff08;又称叉积、外积&#xff09;的几何意义一、面积表示二、垂直性三、方向性四、应用实例五、数学表达 矢量积&#xff08;叉积&#xff09;的坐标表示法矢量积的坐标表示法的几何意义矢量积的性质矢量积的应用 矢量积&#xff08;又称叉积、外积…

Linux——k8s组件

kubernetes 使用1.31.1 版本搭建集群核心组件&#xff0c;选择flannel 网络插件为整体集群的运行提供网络通信功能。 flannel 网络插件 kube-flannel kube-flannel-ds-9fgml 1/1 Running 1 (18m ago) 2d21h kube-flannel kube-flannel-ds-ghwbq …

<<迷雾>> 第 3 章 怎样才能让机器做加法 示例电路

全加器示意图 info::操作说明 鼠标单击开关切换开合状态 primary::在线交互操作链接 https://cc.xiaogd.net/?startCircuitLinkhttps://book.xiaogd.net/cyjsjdmw-examples/assets/circuit/cyjsjdmw-ch03-01-full-adder.txt 原图 由3个全加器组成的3比特加法机 info::操作说明…

Linux——pod的调度

pod的调度 控制器: rc/rs 副本数量控制器 主要保证pod的数量符合管理员要求&#xff0c;并不会对pod进行额外的管理 以下三种控制器&#xff0c;本质上是服务控制器。具备以下特性&#xff1a; 副本数量的控制服务的滚动更新&#xff08;更新pod&#xff09;支持更新失…

基于springboot vue 投票系统设计与实现

博主介绍&#xff1a;专注于Java vue .net php phython 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟 我的博客空间发布了1000毕设题目 方便大家学习使用 感兴趣的…

基于51单片机的2路电压采集proteus仿真

地址&#xff1a;https://pan.baidu.com/s/1oNOJJv78ecfWZkdlMyhNVQ 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52/AT89C51简介&#xff1a; AT89C52/AT89C51是一款经典的8位单片机&#xff0c;是意法半导体&#xff08;STMicroelectron…

Linux:LCD驱动开发

目录 1.不同接口的LCD硬件操作原理 应用工程师眼中看到的LCD 1.1像素的颜色怎么表示 ​编辑 1.2怎么把颜色发给LCD 驱动工程师眼中看到的LCD 统一的LCD硬件模型 8080接口 TFTRGB接口 什么是MIPI Framebuffer驱动程序框架 怎么编写Framebuffer驱动框架 硬件LCD时序分析…

OpenAI全新多模态内容审核模型上线:基于 GPT-4o,可检测文本和图像

在数字时代&#xff0c;内容安全问题愈发受到重视。9月26日&#xff0c;OpenAI 正式推出了一款全新的多模态内容审核模型&#xff0c;名为 “omni-moderation-latest”。 该模型基于最新的 GPT-4o 技术&#xff0c;能够准确地识别检测有害文本图像。这一更新将为开发者提供强大…

Java | Leetcode Java题解之第445题两数相加II

题目&#xff1a; 题解&#xff1a; class Solution {public ListNode addTwoNumbers(ListNode l1, ListNode l2) {Deque<Integer> stack1 new ArrayDeque<Integer>();Deque<Integer> stack2 new ArrayDeque<Integer>();while (l1 ! null) {stack1.…

AI Agent应用出路到底在哪?

1 Agent/Function Call 的定义 Overview of a LLM-powered autonomous agent system&#xff1a; Agent学会调用外部应用程序接口&#xff0c;以获取模型权重中缺失的额外信息&#xff08;预训练后通常难以更改&#xff09;&#xff0c;包括当前信息、代码执行能力、专有信息源…

《深度学习》OpenCV 角点检测、特征提取SIFT 原理及案例解析

目录 一、角点检测 1、什么是角点检测 2、检测流程 1&#xff09;输入图像 2&#xff09;图像预处理 3&#xff09;特征提取 4&#xff09;角点检测 5&#xff09;角点定位和标记 6&#xff09;角点筛选或后处理&#xff08;可选&#xff09; 7&#xff09;输出结果 3、邻域…

深度学习反向传播-过程举例

深度学习中&#xff0c;一般的参数更新方式都是梯度下降法&#xff0c;在使用梯度下降法时&#xff0c;涉及到梯度反向传播的过程&#xff0c;那么在反向传播过程中梯度到底是怎么传递的&#xff1f;结合自己最近的一点理解&#xff0c;下面举个例子简单说明&#xff01; 一、…

Qt开发技巧(九)去掉切换按钮,直接传样式文件,字体设置,QImage超强,巧用Qt的全局对象,信号槽断连,低量数据就用sqlite

继续讲一些Qt开发中的技巧操作&#xff1a; 1.去掉切换按钮 QTabWidget选项卡有个自动生成按钮切换选项卡的机制&#xff0c;有时候不想看到这个烦人的切换按钮&#xff0c;可以设置usesScrollButtons为假&#xff0c;其实QTabWidget的usesScrollButtons属性最终是应用到QTabWi…

衡石分析平台系统管理手册-功能配置之AI 助手集成嵌入指南

AI 助手集成嵌入指南​ 本文档将引导您通过几个简单的步骤&#xff0c;将 AI 助手集成或嵌入到您的系统中。HENGSHI SENSE AI 助手提供了多种集成方式&#xff0c;您可以通过 iframe、JS SDK 或 API 调用等方式将 AI 助手嵌入集成到您的系统中。 1. 通过 iframe 集成​ ifra…

老板最想要的20套模板!基于 VUE 国产开源 IoT 物联网 Web 可视化大屏设计器

如有需求&#xff0c;文末联系小编 Cola-Designer 是一个基于VUE开发&#xff0c;实现拖拽和配置方式生成数据大屏&#xff0c;提供丰富的可视化模板&#xff0c;满足客户业务监控、数据统计、风险预警、地理信息分析等多种业务的展示需求。Cola-Designer 帮助工程师通过图形化…

MySQL - 单表增删改

1. MySQL 概述 MySQL 是一种流行的开源关系型数据库管理系统 (DBMS)&#xff0c;广泛应用于互联网公司和企业开发中。它支持 SQL 语句操作数据&#xff0c;并提供多种版本供选择。 1.1 MySQL 安装和连接 社区版&#xff1a;免费版本&#xff0c;适合开发者使用。商业版&…

sizeof 和 strlen

一 . sizeof 关键字 这个是我们的老朋友了昂&#xff0c;经常都在使用&#xff0c;它是专门用来计算变量所占内存空间大小的&#xff0c;单位是字节&#xff0c;当然&#xff0c;如果我们的操作对象是类型的话&#xff0c;计算的就是类型所创建的变量所占内存的大小&#xff0…

【笔记】神领物流day1.1.13前后端部署【未完】

使用jenkins 前端部署 需要将前端开发的vue进行编译&#xff0c;发布成html&#xff0c;然后通过nginx进行访问&#xff0c;这个过程已经在Jenkins中配置&#xff0c;执行点击发布即可 网址栏输入神领TMS管理系统 (sl-express.com)即可看见启动成功 后端部署看linux 回到Jenki…

25维谛技术面试最常见问题面试经验分享总结(包含一二三面题目+答案)

开头附上工作招聘面试必备问题噢~~包括综合面试题、无领导小组面试题资源文件免费&#xff01;全文干货。 【免费】25维谛技术面试最常见问题面试经验分享总结&#xff08;包含一二三面题目答案&#xff09;资源-CSDN文库https://download.csdn.net/download/m0_72216164/8979…