题目: https://leetcode-cn.com/problems/check-if-one-string-swap-can-make-strings-equal/
给你长度相等的两个字符串 s1 和 s2 。一次 字符串交换 操作的步骤如下:选出某个字符串中的两个下标(不必不同),并交换这两个下标所对应的字符。
如果对 其中一个字符串 执行 最多一次字符串交换 就可以使两个字符串相等,返回 true ;否则,返回 false 。
第一次解题的答案:
public boolean areAlmostEqual(String s1, String s2) {
if (s1.equals(s2)) {
return true;
}
// 长度不相等,直接返回false
if (s1.length() != s2.length()) {
return false;
}
// 找出所有不相等值的下标
List<Integer> list = new ArrayList<>();
for (int i = 0; i < s1.length(); i++) {
if (s1.charAt(i) != s2.charAt(i)) {
list.add(i);
}
}
// 多于或者少于2处,交换之后都不会相等,直接返回false
if (list.size() != 2) {
return false;
}
// 只有两处不同,则判断值是否相等
return s1.charAt(list.get(0)) == s2.charAt(list.get(1)) && s1.charAt(list.get(1)) == s2.charAt(list.get(0));
}
通过,但是不理想
后来发现代码有可以优化的地方,比如既然知道了最多只有2处不同才有可能通过一次交换相等,修改代码,重新提交:
提交结果如下(修改后的代码在下面):
public boolean areAlmostEqual(String s1, String s2) {
if (s1.equals(s2)) {
return true;
}
// 长度不相等,直接返回false
if (s1.length() != s2.length()) {
return false;
}
// 找出所有不相等值的下标
List<Integer> list = new ArrayList<>();
for (int i = 0; i < s1.length(); i++) {
if (s1.charAt(i) != s2.charAt(i)) {
list.add(i);
}
// 多于2处,交换之后都不会相等,直接返回false
if (list.size() > 2) {
return false;
}
}
// 等于1处,,直接返回false
if (list.size() == 1) {
return false;
}
// 只有两处不同,则判断值是否相等
return s1.charAt(list.get(0)) == s2.charAt(list.get(1)) && s1.charAt(list.get(1)) == s2.charAt(list.get(0));
}