E2839.判断通过操作能否让字符串相等 I
string, https://leetcode.cn/problems/check-if-strings-can-be-made-equal-with-operations-i/
给你两个字符串 s1 和 s2 ,两个字符串的长度都为 4 ,且只包含 小写 英文字母。
你可以对两个字符串中的 任意一个 执行以下操作 任意 次:
- 选择两个下标
i和j且满足j - i = 2,然后 交换 这个字符串中两个下标对应的字符。
如果你可以让字符串 s1 和 s2 相等,那么返回 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 == 4s1和s2只包含小写英文字母。
这个问题可以通过观察交换规则来解决。
解题思路
观察交换规则: 操作允许交换下标
和 ,满足 。对于长度为 4 的字符串(下标为 0, 1, 2, 3),这意味着: - 下标 0 的字符只能和下标 2 的字符交换。
- 下标 1 的字符只能和下标 3 的字符交换。
- 偶数下标位置的字符永远不会移动到奇数下标位置,反之亦然。
成立条件: 两个字符串
s1和s2可以相等,当且仅当:s1中所有偶数下标位置的字符集合(即s1[0]和s1[2])与s2中相应位置的字符集合一致。s1中所有奇数下标位置的字符集合(即s1[1]和s1[3])与s2中相应位置的字符集合一致。
具体实现:
- 比较
{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复杂度分析
- 时间复杂度:
。因为字符串长度固定为 4,排序和比较的操作都是常数级别的。 - 空间复杂度:
。只使用了少量的辅助空间。
另一种写法(直接比较)
如果你不想使用 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