目标
给你两个字符串 s1 和 s2 ,两个字符串长度都为 n ,且只包含 小写 英文字母。
你可以对两个字符串中的 任意一个 执行以下操作 任意 次:
选择两个下标 i 和 j ,满足 i < j 且 j - i 是 偶数,然后 交换 这个字符串中两个下标对应的字符。
如果你可以让字符串 s1 和 s2 相等,那么返回 true ,否则返回 false 。
示例 1:
输入:s1 = "abcdba", s2 = "cabdab"
输出:true
解释:我们可以对 s1 执行以下操作:
- 选择下标 i = 0 ,j = 2 ,得到字符串 s1 = "cbadba" 。
- 选择下标 i = 2 ,j = 4 ,得到字符串 s1 = "cbbdaa" 。
- 选择下标 i = 1 ,j = 5 ,得到字符串 s1 = "cabdab" = s2 。
示例 2:
输入:s1 = "abe", s2 = "bea"
输出:false
解释:无法让两个字符串相等。
说明:
- n == s1.length == s2.length
- 1 <= n <= 10^5
- s1 和 s2 只包含小写英文字母。
思路
有两个长度为 n 的字符串 s1 和 s2,判断能否通过操作使二者相等,每次操作交换下标之差为偶数的字母。
与 2839.判断通过操作能否让字符串相等I 相比,字符串长度由 4 变成了 n,操作的下标之差由 2 变成了偶数。
由于本身使用的就是一般解法,没有去特判具体的下标,可以复用之前的代码。
将字母根据下标分组,
代码
/**
* @date 2026-03-30 15:41
*/
public class CheckStrings2840 {
public boolean checkStrings(String s1, String s2) {
int[][] chars = new int[2][26];
int n = s1.length();
for (int i = 0; i < n; i++) {
chars[i % 2][s1.charAt(i) - 'a']++;
chars[i % 2][s2.charAt(i) - 'a']--;
}
for (int[] ca : chars) {
for (int c : ca) {
if (c != 0) {
return false;
}
}
}
return true;
}
}
性能
