【字符串】【打卡107天】leetCode每日一题:859. 亲密字符串

1、题目描述

给你两个字符串 s 和 goal ,只要我们可以通过交换 s 中的两个字母得到与 goal 相等的结果,就返回 true ;否则返回 false 。

交换字母的定义是:取两个下标 i 和 j (下标从 0 开始)且满足 i != j ,接着交换 s[i] 和 s[j] 处的字符。

例如,在 "abcd" 中交换下标 0 和下标 2 的元素可以生成 "cbad" 。

2、算法分析

分为以下几种情况:

①如果s.length() != goal.length()  长度不相等,返回false;

②去除s = "ab", goal = "ab"这种情况。条件是:s 和 goal的长度相等,并且s中没有重复的值。

③遍历s字符串,比较s字符串和goal字符串,遇到不相等的,标记下indexi下标。遇到不相等的,要记录下不相等的次数,time次数为2的时候再不相等也就是第三次,那就返回false;time == 1的时候,说明下一次是第二次不相等,记录下index;time == 0的时候,说明下一次是第一次不相等,并记录下index;

⑤关键来了。s和goal的相对位置的字符相等,返回true;

if(s.charAt(first) == goal.charAt(second) && s.charAt(second) == goal.charAt(first)){
    return true;
}

具体看代码:

3、代码实现

import java.util.*;
class Solution {
    public boolean buddyStrings(String s, String goal) {
        if(s.length() != goal.length()){
            return false;
        }
        Set<Character> set = new HashSet<>();
        for(int i = 0;i < s.length();i++){
            set.add(s.charAt(i));
        }
        // 针对的是s = "ab" , goal == "ab"
        if(s.equals(goal) && s.length() == set.size()){
            return false;
        }
        // 记录不等的次数
        int time = 0;
        // 标记下标第二次不相等的下标
        int second = 0;
        // 标记下标第一次不相等的下标
        int first = 0;
        for(int i = 0;i < s.length();i++){
            if(s.charAt(i) != goal.charAt(i)){
                if(time == 2){
                    return false;
                }
                if(time == 1){
                    second = i;
                }
                if(time == 0){
                    first = i;
                }
                // 每次不相等的时候记得time++
                time++;
            }
        }
        // 若s == "aa" goal == "aa",那么返回的是true 
        if(s.charAt(first) == goal.charAt(second) && s.charAt(second) == goal.charAt(first)){
            return true;
        }
        return false;
    }
}

Guess you like

Origin blog.csdn.net/Sunshineoe/article/details/121505661