文章目录
- 刷题前唠嗑
- 题目:确定两个字符串是否接近
- 题目描述
- 代码与解题思路
- 结语
刷题前唠嗑
LeetCode?启动!!!
刷完今天,我的每日一题就坚持一个月啦,月度勋章要到手啦
今早很尴尬,明明已经 12 点这么早睡觉了,结果早上 10 点才起床,只能说可能是最近这段时间熬夜确实比较重,身体见到有机会就趁机调养一下,这也是我早睡的目的啦
题目:确定两个字符串是否接近
题目链接:1657. 确定两个字符串是否接近
题目描述
代码与解题思路
func closeStrings(word1 string, word2 string) bool {
c1, c2 := make([]int, 26), make([]int, 26)
for _, v := range word1 {
c1[v-'a']++
}
for _, v := range word2 {
c2[v-'a']++
}
sort.Ints(c1)
sort.Ints(c2)
for i := 0; i < 26; i++ {
if c1[i] != c2[i] {
return false
}
}
return true
}
上面代码是错的,我一开始理解错题目的意思了,我以为只要字母之间是可以任意替换的,其实不是,两个品种的字母之间想要替换需要保证他们的数量是相同的才行,举个例子:
- “aabbcc” 和 “aaaabc” 是没法替换的
- “abbbbc” 和 “accccb” 才能替换,因为 b 和 c 两个品种的数量相等
正确代码:
func closeStrings(word1 string, word2 string) bool {
if len(word1) != len(word2) {
return false
}
var c1, c2 [26]int
for _, v := range word1 {
c1[v-'a']++
}
for _, v := range word2 {
c2[v-'a']++
}
for i := 0; i < 26; i++ {
if c1[i] == 0 && c2[i] == 0 { // 如果都不存在这个数字,就继续遍历
continue
}
if c1[i] == 0 || c2[i] == 0 { // 一个存在一个不存在,返回 false
return false
}
}
slices.Sort(c1[:])
slices.Sort(c2[:])
return slices.Equal(c1[:], c2[:])
}
这道题目说难不难,说简单也不简单,如标题,脑筋急转弯,你只需要想清楚两个点,这道题就非常容易了:
- 想要成功替换让两个数组相等,他们的长度必须相同。这就是第一行代码做的事情
- 题目支持字母之间的平替,也就是在字符串长度相同的情况下,两个字符串的字母的不同品种之间的数量相同也能满足要求。这就是后面那一大段代码做的事情,就是判断这个
所以这道题肯定是可以用位运算来做的,不过我比较懒,就不实现了
结语
开心