【力扣】2506:统计相似字符串对的数目

embedded/2025/2/27 3:19:59/

【力扣算法】2506:统计相似字符串对的数目

题目:

给你一个下标从 0 开始的字符串数组 words

如果两个字符串由相同的字符组成,则认为这两个字符串 相似

  • 例如,"abca""cba" 相似,因为它们都由字符 'a''b''c' 组成。
  • 然而,"abacba""bcfd" 不相似,因为它们不是相同字符组成的。

请你找出满足字符串 words[i]words[j] 相似的下标对 (i, j) ,并返回下标对的数目,其中 0 <= i < j <= words.length - 1

示例 1:

输入:words = ["aba","aabb","abcd","bac","aabc"]
输出:2
解释:共有 2 对满足条件:
- i = 0 且 j = 1 :words[0] 和 words[1] 只由字符 'a' 和 'b' 组成。 
- i = 3 且 j = 4 :words[3] 和 words[4] 只由字符 'a'、'b' 和 'c' 。 

示例 2:

输入:words = ["aabb","ab","ba"]
输出:3
解释:共有 3 对满足条件:
- i = 0 且 j = 1 :words[0] 和 words[1] 只由字符 'a' 和 'b' 组成。 
- i = 0 且 j = 2 :words[0] 和 words[2] 只由字符 'a' 和 'b' 组成。 
- i = 1 且 j = 2 :words[1] 和 words[2] 只由字符 'a' 和 'b' 组成。 

示例 3:

输入:words = ["nba","cba","dba"]
输出:0
解释:不存在满足条件的下标对,返回 0 。

提示:

  • 1 <= words.length <= 100
  • 1 <= words[i].length <= 100
  • words[i] 仅由小写英文字母组成

方法一

参考代码

/*** @param {string[]} words* @return {number}*/
var similarPairs = function (words) {if (words.length <= 0) return falselet count= 0;for (let i = 0; i < words.length; i++) {const set1 = new Set(words[i]);for (let j = i + 1; j < words.length; j++) {const set2 = new Set(words[j]);if (isSameSet(set1, set2)) {count++;}}}return count;
};function isSameSet(set1, set2) {if (set1.size !== set2.size) {return false;}for (let value of set1) {if (!set2.has(value)) {return false;}}return true;
}

思路解析

  1. similarPairs 函数
    • 初始化一个变量 count 用于记录相似字符串对的数量。
    • 使用两层嵌套的 for 循环遍历 words 数组中的每一对字符串。外层循环控制 i,内层循环控制 j,且保证 j > i
    • 对于每一对字符串 words[i]words[j],分别创建它们字符的集合 set1set2
    • 调用 isSameSet 函数判断这两个集合是否相同,如果相同则 count 加 1。
    • 最后返回 count
  2. isSameSet 函数
    • 首先检查两个集合的大小是否相同,如果不同则直接返回 false
    • 遍历第一个集合中的每个元素,检查第二个集合中是否包含该元素,如果有任何元素不在第二个集合中,则返回 false
    • 如果所有检查都通过,则返回 true,表示两个集合相同。

new Set() 是用来创建 Set 对象的构造函数。你可以给它传入一个可迭代对象(像数组、字符串之类的),构造函数会遍历这个可迭代对象,将其中的每个元素添加到新创建的 Set 中。

const word = "abca";
const charSet = new Set(word);
console.log(charSet); 
//在上述示例中,字符串 "abca" 被传入 new Set() 构造函数,最终生成的 charSet 是 Set(3) {'a', 'b', 'c'}。可以看到,重复的字符 'a' 只保留了一个。

方法二(官方题解)

参考代码

var similarPairs = function(words) {let res = 0;const cnt = new Map();for (const word of words) {let state = 0;for (const c of word) {state |= 1 << (c.charCodeAt(0) - 'a'.charCodeAt(0));}res += cnt.get(state) || 0;cnt.set(state, (cnt.get(state) || 0) + 1);}return res;
};

思路解析

字符串仅由小写字母组成,因此一个字符串含有的字符集合,可以用一个26位的二进制数字表示状态。从低位到高位,如果这一位为1,则表示含有对应的小写字母。遍历words,并用一个哈希表cnt记录每个状态出现的次数,对于每个word,计算其对应的状态state,并将结果增加cnt[state],表示当前字符串与之前遍历过的所有同状态的字符串都相似,然后将cnt[state]自增1。最后返回结果。

复杂度分析

  • 时间复杂度:O(m×n),其中n是数组words的长度,m是数组words中单个字符串的平均长度。
  • 空间复杂度:O(n)。

http://www.ppmy.cn/embedded/167428.html

相关文章

鸿蒙实战篇-解决报错提示“code:9568305 error: dependent module does not exist”

大家好&#xff0c;这里是鸿蒙开天组&#xff0c;好久不见了&#xff0c;前段时间比较忙&#xff0c;所以没怎么发过文&#xff0c;今天咱们先来个过年后的好头&#xff0c;发一篇简单又实用的实战文吧&#xff01; 一、问题现象&#xff1a; 相信有部分可能都遇到过这么一个…

一周学会Flask3 Python Web开发-Jinja2模板访问对象

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 如果渲染模板传的是对象&#xff0c;如果如何来访问呢&#xff1f; 我们看下下面示例&#xff1a; 定义一个Student类 cla…

【Linux】34.封装 UdpSocket(1)

文章目录 1. 实现一个简易的远程命令执行系统1.1 日志系统 (Log.hpp)1.2 UDP客户端 (UdpClient.cc)1.3 UDP服务器 (UdpServer.hpp)1.4 主程序 (main.c) 1. 实现一个简易的远程命令执行系统 1.1 日志系统 (Log.hpp) Log.hpp #pragma once // 防止头文件重复包含// 必要的头文…

存储产品和数据库产品之间有没有竞争关系

互联网各领域资料分享专区(不定期更新): Sheet 前言 存储产品通常指用于数据存储的硬件或软件解决方案,比如硬盘、NAS、SAN,或者云存储服务如Amazon S3、阿里云OSS。它们主要关注数据的持久化、可扩展性、可靠性和访问速度,但可能不提供复杂的数据处理功能。数据库产品则是…

功能测试-黑盒测试

黑盒测试是一种功能测试方法&#xff0c;它将软件视为一个“黑盒”&#xff0c;即测试人员不关心软件的内部结构和实现&#xff0c;细节只关注软件的输入和输出是否符合预期。以下是黑盒测试方法的详细解释&#xff1a; 1. 黑盒测试的核心理念 黑盒测试的核心在于验证软件的功…

HTML Application(hta)入门教程

简介 HTA是HTML Application的缩写&#xff0c;又称为HTML应用程序。 hta是一个可执行文件&#xff0c;双击可以直接运行 hta与html非常相似&#xff0c;可直接将文件后缀改为.hta来获得HTA格式的文件。 支持VBS和JavaScript html的权限被限制在网页浏览器内&#xff0c;只有操…

SOME/IP-SD -- 协议英文原文讲解5

前言 SOME/IP协议越来越多的用于汽车电子行业中&#xff0c;关于协议详细完全的中文资料却没有&#xff0c;所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块&#xff1a; 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 5.1.2.5 S…

抓包工具 wireshark

1.什么是抓包工具 抓包工具是什么&#xff1f;-CSDN博客 2.wireshark的安装 【抓包工具】win 10 / win 11&#xff1a;WireShark 下载、安装、使用_windows抓包工具-CSDN博客 3.wireshark的基础操作 Wireshark零基础使用教程&#xff08;超详细&#xff09; - 元宇宙-Meta…