2531. 使字符串总不同字符的数目相等

187 阅读1分钟

题目:
给你两个下标从 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
}