题目:
给你两个下标从 0 开始的字符串 word1 和 word2 。
一次 移动 由以下两个步骤组成:
- 选中两个下标
i和j,分别满足0 <= i < word1.length和0 <= j < word2.length, - 交换
word1[i]和word2[j]。
如果可以通过 恰好一次 移动,使 word1 和 word2 中不同字符的数目相等,则返回 true ;否则,返回 false 。
算法:
方法一:暴力枚举
注意到仅由小写字符组成,那么每次从word1,word2取一个字符交换,时间复杂度也就O(26^2)。直接暴力求解
func isItPossible(word1 string, word2 string) bool {
charCount1, charCount2 := count(word1), count(word2)
for i, cnt1 := range charCount1 {
for j, cnt2 := range charCount2 {
// 两字符相等,交换一次不影响原有字符串,比较两字符串不同字符长度是否相等即可
if i == j {
if len(charCount1) == len(charCount2) {
return true
}
// 计算交换之后的word不同字符个数,比较是否相等
} else {
a := len(charCount1)
// charCount1只有一个i字符,i被换掉之后,不同字符串个数减一
if cnt1 == 1 {
a = a - 1
}
// charCount1没有j字符,j换过来之后,不同字符串个数加一
if charCount1[j] == 0 {
a = a + 1
}
b := len(charCount2)
if cnt2 == 1 {
b = b - 1
}
if charCount2[i] == 0 {
b = b + 1
}
if a == b {
return true
}
}
}
}
return false
}
func count(str string) map[int]int {
myMap := make(map[int]int)
for i := range str {
myMap[int(str[i] - 'a')] ++
}
return myMap
}