当前位置: 首页 > news >正文

2026-05-18:统计凯撒加密对数目。用go语言,给定一个长度都为 m、只含小写字母的字符串数组 words(共 n 个)。如果可以通过对两个字符串 s、t 反复执行同一种“整体循环右移字母”的操

2026-05-18:统计凯撒加密对数目。用go语言,给定一个长度都为 m、只含小写字母的字符串数组 words(共 n 个)。如果可以通过对两个字符串 s、t 反复执行同一种“整体循环右移字母”的操作,使它们最终完全一致,那么称 s 与 t 相似。

具体操作是:你可以任选一个当前的字符串,把其中每个字母都替换成字母表中紧接着的下一个字母(例如 z 变成 a)。你可以对 s 或 t 进行任意次(可能为 0 次)这种操作。

现在要统计满足 i < j 且 words[i] 与 words[j] 相似的下标对 (i, j) 的数量,并返回这个数量。

1 <= n == words.length <= 100000。

1 <= m == words[i].length <= 100000。

1 <= n * m <= 100000。

words[i] 仅由小写英文字母组成。

输入: words = [“ab”,“aa”,“za”,“aa”]。

输出: 2。

解释:

words[0] = “ab” 和 words[2] = “za” 是相似的。words[1] = “aa” 和 words[3] = “aa” 是相似的。

题目来自力扣3805。

完整执行步骤

第一步:统计原始字符串的出现次数

  1. 遍历输入数组["ab","aa","za","aa"]
  2. 用哈希表记录每个字符串出现了几次
    • "ab":出现 1 次
    • "aa":出现 2 次
    • "za":出现 1 次
  3. 这一步的作用:避免重复处理相同字符串,直接用计数计算组合数,提升效率。

第二步:核心转换 —— 生成「标准化特征字符串」

这是判断相似的关键:把所有相似的字符串,转换成同一个唯一的特征字符串
转换规则:
对一个字符串,计算每个字符和第一个字符的相对偏移(循环26个字母),最终得到一个只由相对差值组成的新字符串,这就是它的标准化特征。

逐个处理每个原始字符串:

  1. 处理 “ab”
    • 第一个字符是a
    • 转换:a-a=0b-a=1→ 特征字符串:[0,1]
  2. 处理 “aa”
    • 第一个字符是a
    • 转换:a-a=0a-a=0→ 特征字符串:[0,0]
  3. 处理 “za”
    • 第一个字符是z
    • 转换:z-z=0a-z=1(循环后)→ 特征字符串:[0,1]

✅ 结论:

  • abza特征相同 → 相似
  • 两个aa特征相同 → 相似

第三步:统计符合条件的字符串对数量

使用哈希表记录每个特征字符串已经出现的总次数,结合组合数学计算对数:
组合公式:从c个相同元素中选 2 个的数量 =c*(c-1)/2

逐特征计算:

  1. 初始化:空哈希表(存特征→总次数),答案=0
  2. 处理特征[0,1](对应原始字符串ab,数量1)
    • 哈希表中无此特征,新增:[0,1] → 1
    • 组合数:1*0/2=0 → 答案仍为 0
  3. 处理特征[0,0](对应原始字符串aa,数量2)
    • 哈希表中无此特征,新增:[0,0] → 2
    • 组合数:2*1/2=1 → 答案 = 0+1 =1
  4. 处理特征[0,1](对应原始字符串za,数量1)
    • 哈希表中已有此特征(次数=1)
    • 新增对数:1*1 = 1
    • 组合数:1*0/2=0
    • 总答案 = 1+1+0 =2
    • 更新哈希表:[0,1] → 1+1=2

第四步:返回最终结果

最终统计的有效对数为2,和题目要求的输出完全一致。


时间复杂度 & 额外空间复杂度

1. 总时间复杂度

O(n × m)

  • n:字符串的个数
  • m:每个字符串的长度
  • 解释:
    1. 遍历所有字符串统计次数:O(n)
    2. 为每个字符串生成标准化特征:需要遍历字符串的每一个字符,总字符数 = n×m
    3. 哈希表操作都是 O(1) 平均时间
  • 题目限制n×m ≤ 10^5,这个复杂度完全满足要求。

2. 总额外空间复杂度

O(n × m)

  • 解释:
    1. 两个哈希表:存储原始字符串、标准化特征字符串
    2. 所有标准化特征的总长度 = 总字符数 n×m
  • 空间占用与输入总字符数成正比,是最优的空间复杂度。

总结

  1. 核心思路:把相似字符串统一转为相同的标准化特征,用特征分组统计;
  2. 计算方式:用组合计数快速统计每一组内的有效字符串对;
  3. 最终效率:时间 O(n×m),空间 O(n×m),完美适配题目数据规模。

Go完整代码如下:

packagemainimport("fmt")funccountPairs(words[]string)int64{cntWords:=map[string]int{}for_,s:=rangewords{cntWords[s]++}ans:=0cnt:=map[string]int{}fors,c:=rangecntWords{t:=[]byte(s)base:=t[0]fori:=ranget{t[i]=(t[i]-base+26)%26// 保证结果在 [0, 25] 中}s=string(t)ans+=cnt[s]*c+c*(c-1)/2// c 个 s 中选 2 个有 C(c, 2) 种方案cnt[s]+=c}returnint64(ans)}funcmain(){words:=[]string{"ab","aa","za","aa"}result:=countPairs(words)fmt.Println(result)}

Python完整代码如下:

# -*-coding:utf-8-*-defcount_pairs(words):# Count occurrences of each wordcnt_words={}forsinwords:cnt_words[s]=cnt_words.get(s,0)+1ans=0cnt={}fors,cincnt_words.items():# Convert string to list of bytes (characters)t=list(s)base=ord(t[0])# Get ASCII value of first character# Transform each characterforiinrange(len(t)):# (t[i] - base + 26) % 26t[i]=chr((ord(t[i])-base+26)%26+ord('a'))transformed_s=''.join(t)# ans += cnt[s]*c + c*(c-1)//2ans+=cnt.get(transformed_s,0)*c+c*(c-1)//2# cnt[s] += ccnt[transformed_s]=cnt.get(transformed_s,0)+creturnansdefmain():words=["ab","aa","za","aa"]result=count_pairs(words)print(result)if__name__=="__main__":main()

C++完整代码如下:

#include<iostream>#include<vector>#include<string>#include<unordered_map>#include<map>usingnamespacestd;longlongcountPairs(vector<string>&words){unordered_map<string,int>cntWords;for(conststring&s:words){cntWords[s]++;}longlongans=0;unordered_map<string,int>cnt;for(constauto&entry:cntWords){string s=entry.first;intc=entry.second;string t=s;charbase=t[0];for(inti=0;i<t.length();i++){t[i]=(t[i]-base+26)%26;// 保证结果在 [0, 25] 中}ans+=(longlong)cnt[t]*c+(longlong)c*(c-1)/2;cnt[t]+=c;}returnans;}intmain(){vector<string>words={"ab","aa","za","aa"};longlongresult=countPairs(words);cout<<result<<endl;return0;}

http://www.jsqmd.com/news/838687/

相关文章:

  • LightDB 数值格式化深度解析:从数据库内核到DBeaver显示的完整链路
  • Adobe-GenP完整指南:5步轻松激活Adobe全系列软件
  • 3步掌握BilibiliDown:跨平台B站视频下载神器轻松收藏你喜欢的视频
  • 厂房管道安装难题频发?专业承包与设计施工一体化方案这样选 - 品牌2025
  • 初创公司如何利用Taotoken以可控成本试用多模型
  • Python锚点链接解析利器pyanchor:高效处理HTML/Markdown文档内部链接
  • Qt 项目实战:SARibbon库的工程化集成与界面重构
  • 提升开发效率:基于Vim哲学的光标导航优化方案
  • 2026年长岛近景区民宿服务实测,建议收藏 - 奔跑123
  • UAV Log Viewer:无人机飞行日志分析的终极浏览器解决方案
  • 解锁RPG游戏资源宝库:浏览器解密工具全攻略
  • 应对嵌入式蓝牙音频开发挑战:ESP32-A2DP如何实现高性能无线音乐传输的技术优势
  • 嵌入式系统电池管理:从硬件架构到软件策略的全局低功耗设计
  • 心理学实验小白必看:用E-Prime 3.0从零设计你的第一个Stroop任务(附完整流程)
  • 2026力矩传感器质量稳定,广东犸力口碑出众成推荐之选 - 品牌速递
  • 如何用MGit在Android手机上轻松管理Git仓库:完整指南
  • ZeroFlow实战解析:如何用蒸馏框架实现无标签实时场景流估计
  • 汇编无所不能,C产生效率
  • 3分钟搞定华硕笔记本性能优化:G-Helper轻量控制中心完全指南
  • Arm CADI 2.0调试接口架构与多调试器协同实践
  • OPTIGA Trust M MTR安全芯片:为物联网设备提供硬件级安全与Matter认证
  • 对比在ubuntu上直接使用原厂api与通过taotoken调用的账单清晰度差异
  • 2026届学术党必备的五大AI辅助论文助手实测分析
  • 为Claude Code配置Taotoken以解决账号封禁与Token不足问题
  • 5分钟掌握biliTickerBuy:B站会员购抢票神器完全指南
  • Koikatu游戏终极增强指南:如何一键安装200+模组与完整汉化补丁
  • vLLM:基于PagedAttention的高性能大模型推理引擎部署与优化指南
  • 如何实现Minecraft离线畅玩?PrismLauncher-Cracked完全指南
  • 56.自定义协议
  • PostgreSQL online DDL工具pg-osc介绍