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));
    }
}

Guess you like

Origin blog.csdn.net/weixin_43260719/article/details/121498730