需求

输入两个字符串,如果交换第1个字符串中的两个字符后就可以得到第2个字符串,则表明这两个字符串可以相互转换。 例如输入“acb”和“cab”,可以满足转换。

思路

要满足转换条件,两个字符串需要满足如下条件:

  1. 如果两个字符串完全相同,则只有字符串中存在重复的字符时才满足条件(将重复的字符交换一次)。
  2. 如果两个字符串不同,则它们的长度需要相同,并且两个字符串只有两个位置的字符相异(假设为m位和位)。
  3. 判断字符串A和字符串B不同的两位对应的字符是否满足如下条件: A[m]==B[n]且A[n]==b[m]

实现

package chapter04

func exchange(a, b string) bool {
    if len(a) != len(b) {
        return false
    }

    n, m := -1, -1
    for i := range a {
        if a[i] != b[i] {
            if n == -1 {
                n = i
            }else if m == -1 {
                m = i
            }else {
                return false
            }
        }
    }

    if a == b && len(set(a)) < len(a) {
        return true
    }

    if n != -1 && m != -1 && a[n] == b[m] && a[m] == b[n] {
        return true
    }

    return false
}

// 字符串去重
func set(s string) string {
    var hashTable = make(map[string]string)
    var res string
    for _, v := range s {
        k := string(v)
        if _, ok := hashTable[k]; !ok {
            hashTable[k] = k
            res += string(v)
        }
    }
    return res
}