Skip to content

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

string, https://leetcode.cn/problems/check-if-strings-can-be-made-equal-with-operations-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 只包含小写英文字母。

这个问题可以通过观察交换规则来解决。

解题思路

  1. 观察交换规则: 操作允许交换下标 ij,满足 ji=2。对于长度为 4 的字符串(下标为 0, 1, 2, 3),这意味着:

    • 下标 0 的字符只能和下标 2 的字符交换。
    • 下标 1 的字符只能和下标 3 的字符交换。
    • 偶数下标位置的字符永远不会移动到奇数下标位置,反之亦然。
  2. 成立条件: 两个字符串 s1s2 可以相等,当且仅当:

    • s1 中所有偶数下标位置的字符集合(即 s1[0]s1[2])与 s2 中相应位置的字符集合一致。
    • s1 中所有奇数下标位置的字符集合(即 s1[1]s1[3])与 s2 中相应位置的字符集合一致。
  3. 具体实现

    • 比较 {s1[0], s1[2]} 是否等于 {s2[0], s2[2]}
    • 比较 {s1[1], s1[3]} 是否等于 {s2[1], s2[3]}
    • 在 Python 中,由于只有两个字符,我们可以直接手动枚举两种可能,或者对这两个字符进行排序后比较。

    代码实现

python
class Solution:
    def canBeEqual(self, s1: str, s2: str) -> bool:
        # 检查偶数下标位置 (0, 2) 的字符是否匹配
        # 两种情况:直接相等,或者交换后相等
        even_match = (sorted([s1[0], s1[2]]) == sorted([s2[0], s2[2]]))
        
        # 检查奇数下标位置 (1, 3) 的字符是否匹配
        odd_match = (sorted([s1[1], s1[3]]) == sorted([s2[1], s2[3]]))
        
        return even_match and odd_match

复杂度分析

  • 时间复杂度O(1)。因为字符串长度固定为 4,排序和比较的操作都是常数级别的。
  • 空间复杂度O(1)。只使用了少量的辅助空间。

另一种写法(直接比较)

如果你不想使用 sorted,也可以利用逻辑判断:

python
class Solution:
    def canBeEqual(self, s1: str, s2: str) -> bool:
        # 检查偶数位
        cond1 = (s1[0] == s2[0] and s1[2] == s2[2]) or (s1[0] == s2[2] and s1[2] == s2[0])
        # 检查奇数位
        cond2 = (s1[1] == s2[1] and s1[3] == s2[3]) or (s1[1] == s2[3] and s1[3] == s2[1])
        
        return cond1 and cond2