859 亲密字符串 简单
发布者:admin 发表于:443天前 阅读数:496 评论:0

859. 亲密字符串 简单

给定两个由小写字母构成的字符串 A 和 B ,只要我们可以通过交换 A 中的两个字母得到与 B 相等的结果,就返回 true ;否则返回 false 。

交换字母的定义是取两个下标 i 和 j (下标从 0 开始),只要 i!=j 就交换 A[i] 和 A[j] 处的字符。例如,在 “abcd” 中交换下标 0 和下标 2 的元素可以生成 “cbad” 。

示例 1:

输入: A = "ab", B = "ba"
输出: true
解释: 你可以交换 A[0] = 'a' 和 A[1] = 'b' 生成 "ba",此时 A 和 B 相等。

示例 2:

输入: A = "ab", B = "ab"
输出: false
解释: 你只能交换 A[0] = 'a' 和 A[1] = 'b' 生成 "ba",此时 A 和 B 不相等。

示例 3:

输入: A = "aa", B = "aa"
输出: true
解释: 你可以交换 A[0] = 'a' 和 A[1] = 'a' 生成 "aa",此时 A 和 B 相等。

示例 4:

输入: A = "aaaaaaabc", B = "aaaaaaacb"
输出: true

示例 5:

输入: A = "", B = "aa"
输出: false

提示:

0 <= A.length <= 20000

0 <= B.length <= 20000

A 和 B 仅由小写字母构成。

代码参考:

package main

import "fmt"

func main() {
    fmt.Println(buddyStrings("", ""))         // false
    fmt.Println(buddyStrings("aa", "aa"))     // true
    fmt.Println(buddyStrings("ab", "ab"))     // false
    fmt.Println(buddyStrings("abab", "abab")) // true
    fmt.Println(buddyStrings("abcd", "abcd")) // false
}

// 捋清楚逻辑,找规律...
func buddyStrings(A string, B string) bool {
    if len(A) != len(B) || A == "" || B == "" {
        return false
    }
    diff := make([]int, 0, 2)
    for index := range B {
        if A[index] != B[index] {
            diff = append(diff, index)
        }
    }
    switch len(diff) {
    case 0:
        repeat := false
        for i := 1; i < len(A); i++ {
            if A[0] == A[i] {
                repeat = true
            }
        }
        return repeat
    case 1:
        return false
    case 2:
        runes := []rune(A)
        runes[diff[0]], runes[diff[1]] = runes[diff[1]], runes[diff[0]]
        return string(runes) == B
    }
    return false
}