题目要求:
如果可以使用以下操作从一个字符串得到另一个字符串,则认为两个字符串 接近 :
-
操作 1:交换任意两个 现有 字符。
- 例如,
abcde -> aecdb
- 例如,
-
操作 2:将一个 现有 字符的每次出现转换为另一个 现有 字符,并对另一个字符执行相同的操作。
- 例如,
aacabb -> bbcbaa(所有a转化为b,而所有的b转换为a)
- 例如,
你可以根据需要对任意一个字符串多次使用这两种操作。
给你两个字符串,word1 和 word2 。如果 **word1 **和 **word2 **接近 ,就返回 true ;否则,返回 **false **。
示例 1:
输入: word1 = "abc", word2 = "bca"
输出: true
解释: 2 次操作从 word1 获得 word2 。
执行操作 1:"abc" -> "acb"
执行操作 1:"acb" -> "bca"
示例 2:
输入: word1 = "a", word2 = "aa"
输出: false
解释: 不管执行多少次操作,都无法从 word1 得到 word2 ,反之亦然。
示例 3:
输入: word1 = "cabbba", word2 = "abbccc"
输出: true
解释: 3 次操作从 word1 获得 word2 。
执行操作 1:"cabbba" -> "caabbb"
执行操作 2:"caabbb" -> "baaccc"
执行操作 2:"baaccc" -> "abbccc"
提示:
1 <= word1.length, word2.length <= 105
word1和word2仅包含小写英文字母
解题思路
1.判断 sss 和 ttt 的长度是否一样,如果不一样直接返回 false。
2.判断 sss 和 ttt 的字符集合是否一样,如果不一样直接返回 false。例如 sss 中有字符 abc\texttt{abc}abc,ttt 中有字符 def\texttt{def}def,我们无论如何都不能把 sss 变成 ttt。
3.判断 sss 的字符出现次数的集合,是否等于 ttt 的字符出现次数的集合,等于返回 true,不等于返回 false。注意集合可以有相同元素,比如 aabbbccc\texttt{aabbbccc}aabbbccc 对应的集合就是 {2,3,3}{2,3,3}{2,3,3}。
代码:
func closeStrings(word1 string, word2 string) bool {
// 判断两个字符串长度是否相同
if len(word1) != len(word2) {
return false
}
// 判断两个字符串中字符种类是否相同
ccnt, tcnt := [26]int{}, [26]int{}
for _, v := range word1 {
ccnt[v-'a']++
}
for _, v := range word2 {
tcnt[v-'a']++
}
for i := 0; i < 26; i++ {
if (ccnt[i] == 0) != (tcnt[i] == 0) {
return false
}
}
// 判断字符数字是否相同
slices.Sort(ccnt[:])
slices.Sort(tcnt[:])
return slices.Equal(ccnt[:], tcnt[:])
}