Leetcode 839. 相似字符串组【附并查集模板】

news/2024/10/11 10:30:53

1.题目基本信息

1.1.题目描述

如果交换字符串 X 中的两个不同位置的字母,使得它和字符串 Y 相等,那么称 X 和 Y 两个字符串相似。如果这两个字符串本身是相等的,那它们也是相似的。

例如,”tars” 和 “rats” 是相似的 (交换 0 与 2 的位置); “rats” 和 “arts” 也是相似的,但是 “star” 不与 “tars”,”rats”,或 “arts” 相似。

总之,它们通过相似性形成了两个关联组:{“tars”, “rats”, “arts”} 和 {“star”}。注意,”tars” 和 “arts” 是在同一组中,即使它们并不相似。形式上,对每个组而言,要确定一个单词在组中,只需要这个词和该组中至少一个单词相似。

给你一个字符串列表 strs。列表中的每个字符串都是 strs 中其它所有字符串的一个字母异位词。请问 strs 中有多少个相似字符串组?

1.2.题目地址

https://leetcode.cn/problems/similar-string-groups/description/

2.解题方法

2.1.解题思路

并查集

2.2.解题步骤

第一步,构建检测两个字符串是否相似的判断函数,实现该功能只需要统计俩字符串中不相等字符的个数,因为题目已经规定每个字符串的都是同一个字符串的异位词,如果不相等的字符个数等于2,则代表相似,反之,不相似。

第二步,构建并查集对象,并将所有字符串添加到并查集中,进行初始化。

第三步,遍历并查集的roots字典,获取构建的集合的个数(键值相等的键值对数即为集合个数),集合的个数即为题解。

3.解题代码

Python代码【带并查集模板】

class UninFind():def __init__(self):self.roots={}self.rootSizes={}def add(self,x):if x not in self.roots:self.roots[x]=xself.rootSizes[x]=1def find(self,x):root=xwhile root!=self.roots[root]:root=self.roots[root]while x!=root:temp=self.roots[x]self.roots[x]=rootx=tempreturn rootdef union(self,x,y):xroot,yroot=self.find(x),self.find(y)if xroot!=yroot:# 优化合并if self.rootSizes[xroot]<self.rootSizes[yroot]:self.roots[xroot]=yrootself.rootSizes[yroot]+=self.rootSizes[xroot]else:self.roots[yroot]=xrootself.rootSizes[xroot]+=self.rootSizes[yroot]class Solution:# 并查集# 第一步,构建检测两个字符串是否相似的判断函数,实现该功能只需要统计俩字符串中不相等字符的个数,因为题目已经规定每个字符串的都是同一个字符串的异位词,如果不相等的字符个数等于2,则代表相似,反之,不相似。# 第二步,构建并查集对象,并将所有字符串添加到并查集中,进行初始化。# 第三步,遍历并查集的roots字典,获取构建的集合的个数(键值相等的键值对数即为集合个数),集合的个数即为题解。def numSimilarGroups(self, strs: List[str]) -> int:length=len(strs)uf=UninFind()for str_ in strs:uf.add(str_)# 检查s1、s2是否相似def checkSim(s1,s2):notSameCnt=0for a,b in zip(s1,s2):if a!=b:notSameCnt+=1if notSameCnt>2:return Falsereturn notSameCnt==2for i in range(length):for j in range(i+1,length):if checkSim(strs[i],strs[j]):uf.union(strs[i],strs[j])result=0for key,val in uf.roots.items():if key==val:result+=1# print(result)return result

4.执行结果

在这里插入图片描述

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

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

相关文章

实现远距离通信 PS304数字接口转发器实现UART转换为I2C、SPI、1Wire等多种数字接口!

实现远距离通信 PS304数字接口转发器实现UART转换为I2C、SPI、1Wire等多种数字接口!PS304多种数字接口物理层协议转发器,能够实现UART转换为I2C、SPI、1Wire等其他数字接口,以实现远距离通信。该转发器具备内嵌磁隔离双电源及辅助增强电源电路、自适应线缆算法和强大灵活的S…

简便安装,零要求高度,一体化设计!SD202型拉线地表位移监测设备

简便安装,零要求高度,一体化设计!SD202型拉线地表位移监测设备SD202型拉线地表位移是一种具有一体化密封设计的监测设备。其外观线条流畅美观,安装简便,无需打开机壳,对安装高度没有任何要求。该设备具备无线收发能力,并内置电池和SIM卡,无需额外连接采发模块。因此,它…

Day4 备战CCF-CSP练习

201403-5题目描述 有若干个任务需要在一台机器上运行。 它们之间没有依赖关系,因此可以被按照任意顺序执行。 该机器有两个 CPU 和一个 GPU。 对于每个任务,你可以为它分配不同的硬件资源: 在单个 CPU 上运行。 在两个 CPU 上同时运行。 在单个 CPU 和 GPU 上同时运行。 在两…

Linux安装Jenkins指南

Linux安装Jenkins指南 Jenkins,作为一款开源的自动化服务器,广泛用于持续集成和持续部署(CI/CD)流程中。它提供了强大的插件生态系统,使得集成各种开发工具、版本控制系统和构建工具变得简单高效。本文将详细介绍如何在Linux系统上安装和配置Jenkins。 一、准备工作机器要…

设计方案:FMC303-两路5.6Gsps 14bit DA FMC子卡

一、板卡概述FMC303可实现宽波段、双通道、14位、5.6GSPS(2.8gsps直接射频综合)DAC功能,时钟可采用内部时钟源(可选择锁定到外部参考),或外部提供的采样时钟。此外还为用户提供定制采样控制的触发器输入。FMC303在机械上和电气上符合FMC标准(ANSI/VITA 57.1)。该卡具有多…

kafka基础学习

Kafka 系列的阶段性总结(万字长文,做好准备)这是 Java 极客技术的第 265 篇原创文章 初识 Kafka 什么是 Kafka Kafka 是由 Linkedin 公司开发的,它是一个分布式的,支持多分区、多副本,基于 Zookeeper 的分布式消息流平台,它同时也是一款开源的基于发布订阅模式的消息引擎…

降低数据平台成本 ,Apache Airflow迁移上云案例分享

本文介绍了X集团将开源工作流平台Airflow迁移上华为云的案例,重点展示了开源专业服务中的云服务集成适配服务以及能力定制化服务,为此类型企业提供了一个可参考的范例。本文分享自华为云社区《华为云DTSE团队通过开源专业服务,助力马来西亚X集团平滑迁移上云》,作者:华为云…

maven-jar包管理

覆盖更新导致的问题 背景 快速接入sentinel-starter的包。团队80多个服务已经接入<dependency><artifactId>yxt-sentinel-spring-boot-starter</artifactId><groupId>com.yxt</groupId><version>1.0.0</version></dependency>…