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

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

题目描述

给你两个长度相等的字符串 s1s2

你可以任意次 交换 s1下标同为奇数下标同为偶数 的字符。

判断能否通过若干次这样的交换,使得 s1 变成 s2

示例 1:

输入:s1 = "abcd", s2 = "cdab"

输出:true

解释:交换下标 0 和 2 得到 "cbad",再交换下标 1 和 3 得到 "cdab"。
示例 2:

输入:s1 = "abcd", s2 = "acbd"

输出:false

解释:奇数位字符集合不同。

算法思路

关键观察:

  • 只能交换 奇数下标 之间的字符,或者 偶数下标 之间的字符。
  • 因此,奇数位上的字符 永远无法跑到偶数位上,反之亦然。
  • 问题转化为:
    • s1 中所有奇数下标上的字符组成(频次)必须与 s2 中所有奇数下标上的字符组成完全相同。
    • s1 中所有偶数下标上的字符组成(频次)必须与 s2 中所有偶数下标上的字符组成完全相同。

具体做法

  1. 创建两个二维数组 cnt1[2][26]cnt2[2][26]
    • 第一维 0 表示偶数下标,1 表示奇数下标。
    • 第二维记录对应位置上每个字母出现的次数。
  2. 遍历字符串,根据下标奇偶性,分别统计 s1s2 中每个字母的频次。
  3. 比较两个统计数组是否完全一致。若一致则返回 true,否则 false

代码实现(C++)

cpp 复制代码
class Solution {
public:
    bool canBeEqual(string s1, string s2) {
        int cnt1[2][26]{};   // 统计 s1 中奇偶位置的字母频次
        int cnt2[2][26]{};   // 统计 s2 中奇偶位置的字母频次

        for (int i = 0; i < s1.length(); i++) {
            cnt1[i % 2][s1[i] - 'a']++;
            cnt2[i % 2][s2[i] - 'a']++;
        }

        // 内存比较两个统计数组是否相等
        return memcmp(cnt1, cnt2, sizeof(cnt1)) == 0;
    }
};

复杂度分析

  • 时间复杂度 :O(n)
    一次遍历字符串,n 为字符串长度。
  • 空间复杂度 :O(1)
    只使用了固定大小的数组 2×26,与输入规模无关。

正确性证明

  • 必要性:若 s1 能通过合法交换变成 s2,则奇数位集合与偶数位集合分别保持不变,因此频次统计必然相同。
  • 充分性:若奇偶位上的字符频次分别相同,则我们可以在奇数位内任意排列(通过相邻交换实现任意排列),偶数位同理,因此总能构造出 s2

总结

本题的关键在于将交换限制转化为奇偶位置的独立性,从而用简单的计数比较代替复杂的搜索。这种"奇偶位分离"的思想在字符串处理问题中非常实用。

相关推荐
会编程的土豆2 小时前
【leetcode hot 100】二叉树3
算法·深度优先·图论
ofoxcoding2 小时前
GPT-5.4 API 完全指南:性能实测、成本测算与接入方案(2026)
人工智能·gpt·算法·ai
码农的神经元2 小时前
基于改进 VMD 与自适应小波的水声信号去噪算法实现与分析
算法
tankeven2 小时前
HJ156 走迷宫
c++·算法
旺仔.2913 小时前
STL排序算法详解
数据结构·算法·排序算法
美狐美颜sdk3 小时前
美颜SDK是什么?直播/短视频美颜SDK技术详解
人工智能·算法·美颜sdk·直播美颜sdk·美颜api
华农DrLai3 小时前
什么是远程监督?怎么自动生成训练数据?
人工智能·算法·llm·prompt·知识图谱
计算机安禾3 小时前
【数据结构与算法】第16篇:串(String)的定长顺序存储与朴素模式匹配
c语言·数据结构·c++·学习·算法·visual studio code·visual studio
AI科技星3 小时前
基于v≡c公设的理论优化方案
c语言·开发语言·算法·机器学习·数据挖掘