zoukankan      html  css  js  c++  java
  • leetcode 每日一题解题859. 亲密字符串

    859. 亲密字符串

    1,题目介绍

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

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

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

    示例 1:
    
    输入:s = "ab", goal = "ba"
    输出:true
    解释:你可以交换 s[0] = 'a' 和 s[1] = 'b' 生成 "ba",此时 s 和 goal 相等。
    示例 2:
    
    输入:s = "ab", goal = "ab"
    输出:false
    解释:你只能交换 s[0] = 'a' 和 s[1] = 'b' 生成 "ba",此时 s 和 goal 不相等。
    示例 3:
    
    输入:s = "aa", goal = "aa"
    输出:true
    解释:你可以交换 s[0] = 'a' 和 s[1] = 'a' 生成 "aa",此时 s 和 goal 相等。
    示例 4:
    
    输入:s = "aaaaaaabc", goal = "aaaaaaacb"
    输出:true
    

    2,解题思路

    我的解题代码:

    class Solution {
            public boolean buddyStrings(String s, String goal) {
                if (s == null && goal == null) {
                    // 都为空
                    return true;
                } else if (s == null || goal == null) {
                    // 某个为空,另外一个不为空
                    return false;
                } else if (s.length() != goal.length()) {
                    // 长度不一样
                    return false;
                } else {
                    // 长度一样时,需要额外比对
                    ArrayList<Character> listA = new ArrayList<>();
                    ArrayList<Character> listB = new ArrayList<>();
                    Set<Character> set = new HashSet<>();
                    for (int i = 0; i < s.length(); i++) {
                        set.add(s.charAt(i));
                        if (s.charAt(i) != goal.charAt(i)) {
                            listA.add(s.charAt(i));
                            listB.add(goal.charAt(i));
                            if (listA.size() > 2) {
                                return false;
                            }
                        }
                    }
                    if (listA.size() == 2
                            && listA.get(0).equals(listB.get(1))
                            && listA.get(1).equals(listB.get(0))) {
                        // 刚好只有2个字符不同,且交叉相匹配
                        return true;
                    }else if(listA.size()==0){
                        // 所有字符一样
                        if(set.size()!=s.length()){
                            return true;
                        }else {
                            return false;
                        }
                    }else {
                        // 其他情况不可能
                        return false;
                    }
                }
            }
        }
    

    3,官方解题思路与代码

    class Solution {
        public boolean buddyStrings(String s, String goal) {
            if (s.length() != goal.length()) {
                return false;
            }
            
            if (s.equals(goal)) {
                int[] count = new int[26];
                for (int i = 0; i < s.length(); i++) {
                    count[s.charAt(i) - 'a']++;
                    if (count[s.charAt(i) - 'a'] > 1) {
                        return true;
                    }
                }
                return false;
            } else {
                int first = -1, second = -1;
                for (int i = 0; i < goal.length(); i++) {
                    if (s.charAt(i) != goal.charAt(i)) {
                        if (first == -1)
                            first = i;
                        else if (second == -1)
                            second = i;
                        else
                            return false;
                    }
                }
    
                return (second != -1 && s.charAt(first) == goal.charAt(second) &&
                        s.charAt(second) == goal.charAt(first));
            }
        }
    }
    
    作者:LeetCode-Solution
    链接:https://leetcode-cn.com/problems/buddy-strings/solution/qin-mi-zi-fu-chuan-by-leetcode-solution-yyis/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    
    探究未知是最大乐趣
  • 相关阅读:
    Java 第十一届 蓝桥杯 省模拟赛 洁净数
    Java 第十一届 蓝桥杯 省模拟赛 第十层的二叉树
    Java 第十一届 蓝桥杯 省模拟赛 第十层的二叉树
    Java 第十一届 蓝桥杯 省模拟赛 第十层的二叉树
    Java 第十一届 蓝桥杯 省模拟赛 70044与113148的最大公约数
    Java 第十一届 蓝桥杯 省模拟赛 70044与113148的最大公约数
    20. Valid Parentheses
    290. Word Pattern
    205. Isomorphic Strings
    71. Simplify Path
  • 原文地址:https://www.cnblogs.com/Mufasa/p/15596254.html
Copyright © 2011-2022 走看看