1657-确定两个字符串是否接近
如果可以使用以下操作从一个字符串得到另一个字符串,则认为两个字符串 接近 :
- 操作 1:交换任意两个 现有 字符。
- 例如,
a **b** cd **e** -> a **e** cd **b**
- 例如,
- 操作 2:将一个 现有 字符的每次出现转换为另一个 现有 字符,并对另一个字符执行相同的操作。
- 例如,
**aa** c **abb** -> **bb** c **baa**
(所有a
转化为b
,而所有的b
转换为a
)
- 例如,
你可以根据需要对任意一个字符串多次使用这两种操作。
给你两个字符串,word1
和 word2
。如果 __word1
__ 和 __word2
__接近 ,就返回 true
;否则,返回 __false
__ 。
示例 1:
**输入:** word1 = "abc", word2 = "bca"
**输出:** true
**解释:** 2 次操作从 word1 获得 word2 。
执行操作 1:"a **bc** " -> "a **cb** "
执行操作 1:" **a** c **b** " -> " **b** c **a** "
示例 2:
**输入:** word1 = "a", word2 = "aa"
**输出:** false
**解释:** 不管执行多少次操作,都无法从 word1 得到 word2 ,反之亦然。
示例 3:
**输入:** word1 = "cabbba", word2 = "abbccc"
**输出:** true
**解释:** 3 次操作从 word1 获得 word2 。
执行操作 1:"ca **b** bb **a** " -> "ca **a** bb **b** "
执行操作 2:" **c** aa **bbb** " -> " **b** aa **ccc** "
执行操作 2:" **baa** ccc" -> " **abb** ccc"
示例 4:
**输入:** word1 = "cabbba", word2 = "aabbss"
**输出:** false
**解释:** 不管执行多少次操作,都无法从 word1 得到 word2 ,反之亦然。
提示:
1 <= word1.length, word2.length <= 105
word1
和word2
仅包含小写英文字母
模拟
两类操作都不会凭空产生或删除字符,而仅仅是对字符进行互换。
由于操作 1
和 2
都不限次数,因此我们只需检查「字符种类是否相同」和「字符频次是否相等」,即可得出两字符串是否接近的结论。
具体的,由于 s1
和 s2
都仅包含小写字母,因此可以创建两个大小为 26
的数组 c1
和 c2
分别对两字符串进行词频统计。
随后进行合法性检查:
- 字符种类是否相同:若存在某个字符仅在
s1
或s2
中出现过,两字符串必不接近,返回False
- 字符频次是否相等:对
c1
和c2
进行排序,并逐项检查,若存在c1[i] != c2[i]
,说明存在词频为c1[i]
的字符种类数在s1
和s2
间并不相等,返回False
若上述两项检查无误,说明两字符串接近,返回 True
。
代码:
1 | class Solution { |
1 | class Solution: |
1 | class Solution { |
1 | function closeStrings(s1: string, s2: string): boolean { |
- 时间复杂度:统计词频复杂度为 O(n + m);排序复杂度为 O(C\log{C}),其中 C = 26 为字符集大小,进行合法性检查复杂度为 O(C)。整体复杂度为 O(n + m + C\log{C})
- 空间复杂度:O(C)
最后
如果有帮助到你,请给题解点个赞和收藏,让更多的人看到 ~ (“▔□▔)/
所有题解已经加入 刷题指南 ,欢迎 star 哦 ~
Comments