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

LeetCode 2839. 判断通过操作能否让字符串相等 I, 2840. 判断通过操作能否让字符串相等 II【计数排序】

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,还会用多种编程语言实现题解,涉及到通用解法时更将归纳总结出相应的算法模板。

为了方便在PC上运行调试、分享代码文件,我还建立了相关的仓库:https://github.com/memcpy0/LeetCode-Conquest。在这一仓库中,你不仅可以看到LeetCode原题链接、题解代码、题解文章链接、同类题目归纳、通用解法总结等,还可以看到原题出现频率和相关企业等重要信息。如果有其他优选题解,还可以一同分享给他人。

由于本系列文章的内容随时可能发生更新变动,欢迎关注和收藏征服LeetCode系列文章目录一文以作备忘。

2839. 判断通过操作能否让字符串相等 I

给你两个字符串s1s2,两个字符串的长度都为4,且只包含小写英文字母。

你可以对两个字符串中的任意一个执行以下操作任意次:

  • 选择两个下标ij且满足j - i = 2,然后交换这个字符串中两个下标对应的字符。

如果你可以让字符串s1s2相等,那么返回true,否则返回false

示例 1:

输入:s1="abcd",s2="cdab"输出:true解释: 我们可以对 s1 执行以下操作:-选择下标 i=0,j=2,得到字符串 s1="cbad"-选择下标 i=1,j=3,得到字符串 s1="cdab"=s2 。

示例 2:

输入:s1="abcd",s2="dacb"输出:false解释:无法让两个字符串相等。

提示:

  • s1.length == s2.length == 4
  • s1s2只包含小写英文字母。

解法 看下标为偶数/奇数的字符个数是否都一样

忽略本题非常特殊的字符串长度,通用做法是,既然可以交换相距为2 22的字符,那么相距为4 44的字符可以通过多次交换实现。例如x − y − z x−y−zxyz变成y − x − z y−x−zyxz变成y − z − x y−z−xyzx变成z − y − x z−y−xzyx

依此类推,所有相距为偶数的字符都可以随意交换

所以只需要看下标为偶数的字符个数是否都一样,以及下标为奇数的字符个数是否都一样。

classSolution{publicbooleancanBeEqual(Strings1,Strings2){varcnt1=newint[2][26];varcnt2=newint[2][26];for(inti=0;i<s1.length();i++){cnt1[i%2][s1.charAt(i)-'a']++;cnt2[i%2][s2.charAt(i)-'a']++;}returnArrays.deepEquals(cnt1,cnt2);}}
classSolution{public:boolcanBeEqual(string s1,string s2){intcnt1[2][26]{},cnt2[2][26]{};for(inti=0;i<s1.length();i++){cnt1[i%2][s1[i]-'a']++;cnt2[i%2][s2[i]-'a']++;}returnmemcmp(cnt1,cnt2,sizeof(cnt1))==0;}};
classSolution:defcanBeEqual(self,s1:str,s2:str)->bool:returnCounter(s1[::2])==Counter(s2[::2])andCounter(s1[1::2])==Counter(s2[1::2])
funccanBeEqual(s1,s2string)bool{varcnt1,cnt2[2][26]intfori,c:=ranges1{cnt1[i%2][c-'a']++cnt2[i%2][s2[i]-'a']++}returncnt1==cnt2}

复杂度分析:

  • 时间复杂度:O ( n + ∣ Σ ∣ ) O(n + | \Sigma |)O(n+∣Σ∣),其中n nns 1 s_1s1的长度。
  • 空间复杂度:O ( ∣ Σ ∣ ) O(|\Sigma|)O(∣Σ∣),其中∣ Σ ∣ |\Sigma|∣Σ∣为字符集合的大小,本题中字符均为小写字母,所以∣ Σ ∣ = 26 |\Sigma| = 26∣Σ∣=26

思考题

改成j − i = 3 j - i = 3ji=3要怎么做?
答:分组计数。j − i = k j-i=kji=k,那就切片分k kk个组,对每个组分别计数、判断左右是否相等。把一维坐标改为i % 3 i\%3i%3,大小设置为[ 3 ] [ 26 ] [3][26][3][26]


2840. 判断通过操作能否让字符串相等 II

给你两个字符串s1s2,两个字符串长度都为n,且只包含小写英文字母。

你可以对两个字符串中的任意一个执行以下操作任意次:

  • 选择两个下标ij,满足i < jj - i偶数,然后交换这个字符串中两个下标对应的字符。

如果你可以让字符串s1s2相等,那么返回true,否则返回false

示例 1:

输入:s1="abcdba",s2="cabdab"输出:true解释:我们可以对 s1 执行以下操作:-选择下标 i=0,j=2,得到字符串 s1="cbadba"-选择下标 i=2,j=4,得到字符串 s1="cbbdaa"-选择下标 i=1,j=5,得到字符串 s1="cabdab"=s2 。

示例 2:

输入:s1="abe",s2="bea"输出:false解释:无法让两个字符串相等。

提示:

  • n == s1.length == s2.length
  • 1 <= n <= 10^5
  • s1s2只包含小写英文字母。

解法 看下标为偶数/奇数的字符个数是否都一样

有一个更强的结论:改成j − i = 2 j−i=2ji=2,也是一样的。代码同上。

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

相关文章:

  • wpa_supplicant与eloop机制:如何用C语言实现高效事件驱动框架
  • 从零到一:构建你的私有以太坊开发环境实战
  • 别再让MoE模型训练崩盘了!手把手教你用R3对齐推理路由,实测Qwen3-30B-A3B
  • ArcPro3.0.2实战:北斗网格编码在行政区划管理中的应用
  • iOS 15-16设备iCloud激活锁解除终极指南:简单快速的免费解决方案
  • 嵌入式WiFi开发 | 基于wireless_tools的交叉编译实战与移植指南
  • 安庆靠谱消防排烟管道加工安装推荐,2026热门推荐揭晓,通风管道/空调净化风管/螺旋风管,消防排烟管道厂商推荐 - 品牌推荐师
  • C语言指针魔法:三步拆解单链表逆转核心逻辑
  • 1.4 应用领域分析:人工智能的赋能革命与产业重构-扩容版
  • Gentle:基于Kaldi的语音文本强制对齐解决方案深度解析
  • ESP32新手避坑指南:从零用VSCode+ESP-IDF创建分区表,搞定FAT/SPIFFS文件系统
  • 重新定义虚拟机自动化:CUA Computer SDK颠覆传统操作范式,让跨平台控制像搭积木一样简单
  • page-agent 通过自然语言控制web gui 的agent
  • 20252803 2025-2026-2 《网络攻防实践》第3周作业
  • Raspberry Pi 5 与 Hailo-8L 实战:从零搭建边缘 AI 开发环境
  • 高效掌握西电研究生论文XeLaTeX模板:从零开始的实战避坑指南
  • 解决跨平台命令行工具痛点:GitHub推荐项目精选co/coreutils全平台部署指南
  • 贝叶斯滤波的认知革命:为什么说自动驾驶的感知模块像人类大脑?
  • Realistic Vision V5.1在影楼行业的应用:AI写真人像样片快速预演系统
  • 2026年市面上优秀的混合机直销厂家推荐,犁刀混合机/乳化机/静态混合器/立式混合机/输送机,混合机公司推荐分析 - 品牌推荐师
  • 《[书名]》读书笔记
  • 告别繁琐命令行:在VSCode里像写代码一样玩转CodeQL代码审计
  • Go 内存逃逸检测工具的使用技巧
  • 终极指南:用OpenCore Legacy Patcher让老旧Mac焕发第二春
  • 从L1到Lp:深入解析归一化方法在深度学习中的应用
  • 告别‘盲跑’:基于MT6816磁编码器的步进电机位置PID调试全记录(附STM32代码)
  • 3大核心技术让音乐歌词管理效率提升10倍
  • 极简音乐体验:专注聆听的开源解决方案
  • 面试官最爱问的TCP三次握手:用Wireshark抓包分析全过程
  • 51单片机(九)—— 数码管动态扫描原理与实现