859.亲密字符串----LeetCode(java实现)

解题思路:

大的分类分为三种情形:

(1)两个字符串长度不相等,结果肯定为false

(2)两个字符串长度相等,但是字符串长度小于2,结果为false

(3)字符串长度相等且其长度大于等于2,又分为以下几种情况:

声明一个计数器变量cnt,两个记录索引位置的变量:index1和index2。遍历字符串,只要两个字符串中的字符不等,计数器就加1,index1记录字符串中第一次出现字符不等的位置,index2记录两个字符串中第二次出现字符不等的位置。

①若cnt>2,则表示不能只通过交换一次字母达到两个字符串相等的目的,所以最终返回false

②cnt为1,同样不能通过交换一次字母达到两个字符串相等的目的,返回false

③cnt=0,查看字符串中是否出现重复的字母,如果有字母出现不止一次,则可以通过交换一次字母使得两字符串相等。声明一个map类型的变量,遍历字符串,如果当前字符串中的字符已经在map中出现过,则返回true,反之将其存到map中,若字符串遍历结束,map中无重复字符,则返回false

④cnt=2,如果A[index1]!=B[index2]或B[index1]!=A[index2],则返回false,其他情况返回true

class Solution {
    public boolean buddyStrings(String A, String B) {
        int len1=A.length();
        int len2=B.length();
        if(len1!=len2){
            return false;
        }
        if(len1<2){
            return false;
        }
        int cnt=0;
        int index1=0,index2=0;
        for(int i=0;i<len1;++i){
            if(A.charAt(i)!=B.charAt(i)){
                cnt++;
                if(cnt>2){
                    return false;
                }
                if(cnt==1){
                    index1=i;
                }
                else{
                    index2=i;
                }
            }
        }
        if(cnt==1){
            return false;
        }
        Map<String,Integer> map=new HashMap<String,Integer>();
        if(cnt==0){
            for(int i=0;i<len1;++i){
                String temp=A.substring(i,i+1);
                if(map.containsKey(temp)){
                    return true;
                }
                map.put(temp,i);
            }
            return false;
        }
        //cnt=2
        if(A.charAt(index1)!=B.charAt(index2)||B.charAt(index1)!=A.charAt(index2)){
            return false;
        }
        return true;
    }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值