亲密字符串
难度:
标签:
题目描述
代码结果
运行时间: 28 ms, 内存: 16.2 MB
/*
题目思路:
使用 Java Stream API 来处理字符串。
1. 如果 s 和 goal 的长度不相同,直接返回 false。
2. 如果 s 和 goal 相同,检查 s 中是否有重复的字符,如果有,返回 true。
3. 如果 s 和 goal 不同,找到两个不同的字符位置并交换,检查交换后是否相同。
*/
import java.util.stream.IntStream;
import java.util.stream.Collectors;
public class Solution {
public boolean buddyStrings(String s, String goal) {
if (s.length() != goal.length()) return false;
if (s.equals(goal)) {
long distinctCount = s.chars().distinct().count();
return distinctCount < s.length();
}
int[] diff = IntStream.range(0, s.length())
.filter(i -> s.charAt(i) != goal.charAt(i))
.toArray();
return diff.length == 2 &&
s.charAt(diff[0]) == goal.charAt(diff[1]) &&
s.charAt(diff[1]) == goal.charAt(diff[0]);
}
}
解释
方法:
该题解首先检查两个字符串 s 和 goal 是否具有相同的长度,如果不相同则直接返回 False。接着,如果 s 和 goal 完全相同,那么检查 s 中是否至少有一个字符出现了不止一次;如果有,通过交换同一个字符来保持字符串不变即可满足题目条件。如果 s 和 goal 不完全相同,则寻找两者之间不匹配的字符位置。如果恰好有两处不匹配,检查这两处字符是否可以通过一次交换使 s 变为 goal。具体来说,就是 s 中第一个不匹配字符应与 goal 中第二个不匹配字符相同,反之亦然。
时间复杂度:
O(n)
空间复杂度:
O(k)
代码细节讲解
🦆
在算法中,如果s和goal完全相同且没有重复字符,返回False的逻辑是怎样的?为什么即使完全相同也需要至少有一个重复字符才能返回True?
▷🦆
题解提到如果不匹配的位置不是两处就返回False,能否详细解释一下为什么只有两处不匹配时才能通过一次交换解决问题?
▷🦆
在解决不匹配的两个字符时,直接比较了这两个字符的目标位置是否符合要求,这种方法是否总是有效,或者存在某些特殊情况下会导致错误的结果?
▷