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

标签: 字符串

难度: Easy

给你两个字符串 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 == 4
  • s1 和 s2 只包含小写英文字母。

Submission

运行时间: 28 ms

内存: 0.0 MB

class Solution:
    def canBeEqual(self, s1: str, s2: str) -> bool:
        res1 = (s1[0]==s2[0] and s1[2] == s2[2]) or (s1[0] == s2[2] and s1[2] == s2[0])
        res2 = (s1[1]==s2[1] and s1[3] == s2[3]) or (s1[1] == s2[3] and s1[3] == s2[1])
        return res1 and res2

Explain

这个题解的核心思路是分别比较字符串s1和s2中对应的可以通过特定操作(相隔两个位置的字符交换)交换的字符组。具体来说,s1和s2中的第一个字符与第三个字符可以互换,第二个字符与第四个字符可以互换。因此,题解检查了s1中的第一个字符和第三个字符是否能和s2中的第一个和第三个字符匹配(无论是原始顺序还是交换顺序),并且同样的检查对第二个和第四个字符进行了。只有两组字符都能匹配,函数才会返回true。

时间复杂度: O(1)

空间复杂度: O(1)

class Solution:
    def canBeEqual(self, s1: str, s2: str) -> bool:
        # 检查s1的第1个和第3个字符是否能与s2的第1个和第3个字符匹配
        res1 = (s1[0]==s2[0] and s1[2] == s2[2]) or (s1[0] == s2[2] and s1[2] == s2[0])
        # 检查s1的第2个和第4个字符是否能与s2的第2个和第4个字符匹配
        res2 = (s1[1]==s2[1] and s1[3] == s2[3]) or (s1[1] == s2[3] and s1[3] == s2[1])
        # 如果两组都能匹配,返回true
        return res1 and res2

Explore

在字符串长度为4的情况下,按照题目给定的交换规则(可以交换相隔两个位置的字符),实际上只有两对交换可能:第1个字符与第3个字符,以及第2个字符与第4个字符。因为这两对是唯一满足间隔为2的字符对,所以不需要考虑其他位置的字符。这种交换只涉及这两对,并且不影响其他字符,因此只考虑这两对就足够覆盖所有可能的交换情况。

根据题目规则,允许的交换是相隔两个位置的字符,因此在长度为4的字符串中,唯一的交换可能性就是第1与第3个字符和第2与第4个字符。检查这两对字符是否可以通过直接相等或者交换后相等来匹配,便可以确定整个字符串是否可以通过这种方式变得相等。这两对的检查确保了覆盖所有允许的交换情况,因此可以确定字符串是否可以通过规定的操作匹配。

这种解法的有效性是基于特定的字符串长度(4)和特定的交换规则(相隔两个位置的字符)。如果字符串长度变化或交换规则改变,如允许任意距离的字符交换,这种解法就不再适用。在那种情况下,需要重新考虑如何检查字符间的匹配关系,可能涉及更复杂的数据结构或算法,例如使用图的遍历方法来确定是否可以通过交换得到匹配的字符串。

在本题解的方法中,如果两个字符串具有相同的字符但顺序不同,算法将不能正确判断。例如,对于s1为'aabb'和s2为'bbaa',按照题解,无论是第1与第3字符,还是第2与第4字符的交换,都无法得到匹配的结果。因此,如果字符顺序不同,即使字符集合相同,本题解的方法在没有额外操作的情况下不适用。