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

交换字母的定义是:取两个下标 ij (下标从 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 相等。

 

提示:

  • 1 <= s.length, goal.length <= 2 * 104
  • sgoal 由小写英文字母组成
Related Topics
  • 哈希表
  • 字符串

  • 👍 259
  • 👎 0
  • 遍历比较,简单

    遍历比较

    1. 长度不同 -> false
    2. 遍历字符串, 如果不同的的char超过两个 -> false
    3. 如果只有一个字符不同 -> false
    4. 如果没有字符不同,看原字符串中有无重复的字符,则相同字符互相交换下可以和原来一样 -> true
    5. 剩下有两个字符不同的情况,判断下s字符串中第一个不同字符和goal第二个不同位置的是否一样,且s字符串中第二个不同字符和goal第二个不同位置的是否一样 如果符合 -> true
    6. 否则 -> false
    class Solution {
        public boolean buddyStrings(String s, String goal) {
            if (s.length() != goal.length()){
                return false;
            }
            int[] diff = new int[]{-1,-1};
            int idx = -1;
            int diffCount = -1;
            int[] charCount = new int[25];
            while (++idx < s.length()){
                charCount[s.charAt(idx)-'a']++;
                if (s.charAt(idx) == goal.charAt(idx)){
                    continue;
                }
                if (diffCount == 1){
                    return false;
                }
                diff[++diffCount] = idx;
            }
            if (diffCount == 0){
                return false;
            }
            if (diffCount == -1){
                for (int i : charCount) {
                    if (i > 1){
                        return true;
                    }
                }
                return false;
            }
            return s.charAt(diff[0]) == goal.charAt(diff[1]) && s.charAt(diff[1]) == goal.charAt(diff[0]);
        }
    
    }