leetcode
leetcode 2401 ~ 2450
判断通过操作能否让字符串相等 I

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

难度:

标签:

题目描述

You are given two strings s1 and s2, both of length 4, consisting of lowercase English letters.

You can apply the following operation on any of the two strings any number of times:

  • Choose any two indices i and j such that j - i = 2, then swap the two characters at those indices in the string.

Return true if you can make the strings s1 and s2 equal, and false otherwise.

 

Example 1:

Input: s1 = "abcd", s2 = "cdab"
Output: true
Explanation: We can do the following operations on s1:
- Choose the indices i = 0, j = 2. The resulting string is s1 = "cbad".
- Choose the indices i = 1, j = 3. The resulting string is s1 = "cdab" = s2.

Example 2:

Input: s1 = "abcd", s2 = "dacb"
Output: false
Explanation: It is not possible to make the two strings equal.

 

Constraints:

  • s1.length == s2.length == 4
  • s1 and s2 consist only of lowercase English letters.

代码结果

运行时间: 28 ms, 内存: 0.0 MB


/*
 * 思路:
 * 利用Java Stream API,我们可以通过将字符串转换为字符流并检查相应的条件来实现相同的逻辑。
 * 通过对字符流进行过滤和匹配,可以验证是否存在符合交换条件的字符对。
 */
import java.util.stream.IntStream;

public class Solution {
    public boolean canTransform(String s1, String s2) {
        if (s1.equals(s2)) {
            return true;
        }
        return IntStream.range(0, 4)
                        .filter(i -> i % 2 == 0)
                        .allMatch(i -> s1.charAt(i) == s2.charAt(i + 2) && s1.charAt(i + 2) == s2.charAt(i)) &&
               IntStream.range(1, 4)
                        .filter(i -> i % 2 != 0)
                        .allMatch(i -> s1.charAt(i) == s2.charAt(i + 2) && s1.charAt(i + 2) == s2.charAt(i));
    }
}

解释

方法:

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

时间复杂度:

O(1)

空间复杂度:

O(1)

代码细节讲解

🦆
为什么在字符串长度为4的限制下,只考虑交换具有特定间隔(j - i = 2)的字符就足够了,而不考虑其他位置的字符?
在字符串长度为4的情况下,按照题目给定的交换规则(可以交换相隔两个位置的字符),实际上只有两对交换可能:第1个字符与第3个字符,以及第2个字符与第4个字符。因为这两对是唯一满足间隔为2的字符对,所以不需要考虑其他位置的字符。这种交换只涉及这两对,并且不影响其他字符,因此只考虑这两对就足够覆盖所有可能的交换情况。
🦆
在解法中,你是如何确定只需要检查第一与第三个字符,以及第二与第四个字符之间的交换,就可以覆盖所有可能的情况?
根据题目规则,允许的交换是相隔两个位置的字符,因此在长度为4的字符串中,唯一的交换可能性就是第1与第3个字符和第2与第4个字符。检查这两对字符是否可以通过直接相等或者交换后相等来匹配,便可以确定整个字符串是否可以通过这种方式变得相等。这两对的检查确保了覆盖所有允许的交换情况,因此可以确定字符串是否可以通过规定的操作匹配。
🦆
这种解法是否具有普适性,即如果字符串长度变化或者交换规则改变(比如允许任意距离的交换),解法还会有效吗?
这种解法的有效性是基于特定的字符串长度(4)和特定的交换规则(相隔两个位置的字符)。如果字符串长度变化或交换规则改变,如允许任意距离的字符交换,这种解法就不再适用。在那种情况下,需要重新考虑如何检查字符间的匹配关系,可能涉及更复杂的数据结构或算法,例如使用图的遍历方法来确定是否可以通过交换得到匹配的字符串。
🦆
如果两个字符串有相同的字符但顺序不同,该算法是否还能正确判断?例如,s1为'aabb',s2为'bbaa',这种情况下该方法是否仍然适用?
在本题解的方法中,如果两个字符串具有相同的字符但顺序不同,算法将不能正确判断。例如,对于s1为'aabb'和s2为'bbaa',按照题解,无论是第1与第3字符,还是第2与第4字符的交换,都无法得到匹配的结果。因此,如果字符顺序不同,即使字符集合相同,本题解的方法在没有额外操作的情况下不适用。

相关问题