0字符串简单 LeetCode859. 亲密字符串

859. 亲密字符串

描述

给你两个字符串 s 和 goal ,只要我们可以通过交换 s 中的两个字母得到与 goal 相等的结果,就返回 true ;否则返回 false 。
交换字母的定义是:取两个下标 i 和 j (下标从 0 开始)且满足 i != j ,接着交换 s[i] 和 s[j] 处的字符。
例如,在 “abcd” 中交换下标 0 和下标 2 的元素可以生成 “cbad” 。

分析

满足“亲密字符串”的情况有两种:

  1. 两条字符串相同且有字符出现两次。
  2. 两条字符串不同的字符只有两处且通过交换位置变得一致。
class Solution {
    public boolean buddyStrings(String s, String goal) {
    //排除掉长度不一致的情况
        if(s.length() != goal.length() || s.length() < 2){
            return false;
        }
        //借助set判断两条字符串相同时,是否有字符出现两次。
        Set<Character> set = new HashSet<>();
        if(s.equals(goal)){
            for(int i = 0; i < s.length(); i++){
                set.add(s.charAt(i));
            }
            if(set.size() < s.length()){
                return true;
            }
            return false;
        }
        //借助list判断两条字符串不同的字符有几处,若为2处,交换位置字符串是否变得相等。
        List<Integer> list = new ArrayList<>();
        for(int i = 0; i < s.length(); i++){
            if(s.charAt(i) != goal.charAt(i)){
                list.add(i);
            }
        }
        if(list.size() != 2){
            return false;
        }
        return s.charAt(list.get(0)) == goal.charAt(list.get(1)) && s.charAt(list.get(1)) == goal.charAt(list.get(0));
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值