需求
输入两个字符串,如果交换第1个字符串中的两个字符后就可以得到第2个字符串,则表明这两个字符串可以相互转换。 例如输入“acb”和“cab”,可以满足转换。
思路
要满足转换条件,两个字符串需要满足如下条件:
- 如果两个字符串完全相同,则只有字符串中存在重复的字符时才满足条件(将重复的字符交换一次)。
- 如果两个字符串不同,则它们的长度需要相同,并且两个字符串只有两个位置的字符相异(假设为m位和位)。
- 判断字符串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
}