【Leetcode859】亲密字符串

104 阅读2分钟

这道题官方解答非常给力

这里马克一下学习了

今天刚寄掉了旧电脑qwq 接下来十天左右的时间里要过没有电脑的日子了

回到正题: 题目要求确定两个由小写字母组成的字符串是否能通过一次某两个元素的换位成为完全相同的两个字符串

如"abab"和"aabb"

直接开始官方题解的思路:

首先,如果符合要求,两个字符串肯定至多只有两个元素不同,不然不可能通过一次交换变为相同。

之后,如果两个字符串完全相同:那么要检查是否这个字符串中有出现两次的同一元素;因为如果是每个字符只出现一次的情况,交换过后是不能相同的。

最后一种情况是两个字符串不相同,那么要找到不相同的元素位置;当两个字符串中这两个位置的元素交叉相同时,返回true。

认真看了一遍官方题解代码,感受到了智商碾压。之后再凭理解自己写一遍。

public class Leetcode859 {
public boolean buddyStrings(String A, String B) {
    if(A.length()!=B.length()) return false;
    else if(A.equals(B)){
        //equals, check if there is one element shows up more than once
        int[] count = new int[26];//counter for each char
        for(int i=0;i<A.length();i++){
            count[A.charAt(i)-'a']++;//get index by ASCII, increase
        }
        for(int num:count){
            if(num>=2) return true;//if shows more than once, true
        }
        return false;
    }
    else{//not equal situation
        int diff1=-1,diff2=-1;//set two index, -1 as initialization
        for(int i=0;i<A.length();i++){
            if(A.charAt(i)!=B.charAt(i)){
                if(diff1==-1) diff1=i;
                else if(diff2==-1){
                    diff2=i;
                }
                else{//already has two different element
                    //can not be equal by one swap
                    return false;
                }
            }
        }
        return (A.charAt(diff1)==B.charAt(diff2) && A.charAt(diff2)==B.charAt(diff1));
        }
    }
}

官方最后的布尔判别式有一个diff2!=-1

尝试把这个在源代码中删掉发现内存和速度没有变化也通过了,所以没想清楚为什么需要这一句,毕竟这句的情况我认为已经在前面的条件中筛除了

自己写的代码不知道为啥多消耗了0.1MB的空间 后来再尝试了一次发现用的空间居然便少了很多

这个不深究了

值得注意的点:

1.分类讨论的情况想的比我深入

2.使用count[A.charAt(i)-'a']++;进行元素出现次数统计值得学习

3.整合一个布尔表达式很优雅