class Solution(object):
def areAlmostEqual(self, s1, s2):
"""
:type s1: str
:type s2: str
:rtype: bool
"""
if s1 == s2 : #如果相同,直接返回True
return True
cnt_wrong = 0 # 记录出现不同的地方的个数
unlike_word = [] # 记录不同的字母(去重)
unique_word_s1 = []
unique_word_s2 = []
for i in range(len(s1)):
if s1[i] != s2[i]:
cnt_wrong += 1
if s1[i] not in unlike_word:
unlike_word.append(s1[i])
if s2[i] not in unlike_word:
unlike_word.append(s2[i])
if s1[i] not in unique_word_s1:
unique_word_s1.append(s1[i])
if s2[i] not in unique_word_s2:
unique_word_s2.append(s2[i])
if sorted(unique_word_s1) != sorted(unique_word_s2): #比较所含元素是否相同
return False
if len(unlike_word) == 2 and cnt_wrong == 2: #两字符串中不同的字符位置有且仅有两个则满足条件
return True
else:
return False
1790. 仅执行一次字符串交换能否使两个字符串相等 - 力扣(LeetCode)
一眼看上去很简单,实际上有很多坑的题。
一刷思路:
还是模拟,因为题目已经固定两字符串的长度相同,直接遍历每个下标在两个字符串内元素是否不同。一个必要条件是:当且仅当,这种出现不同元素的下标有且只有两个的时候,会存在最多交换一次就能满足条件。另外一个必要条件是:两字符串中的去重元素应该相同。
坑:
(1)要考虑到只有两个字母的字符串的情况。(刚开始的时候出过bug,条件二可以绕开。)
(2)要考虑只有两字符串虽然在两个地方不同,但同一字符串内该位置相同。如”abbbbba""cbbbbbbc"。同上条件二可以绕开。
(3)比较两list的时候 顺序需要相同。直接排序会导致时间复杂度提高了,暂时没有想到更好的解决方案。
PS:这个排名没什么卵用 刷新一下就是新世界。之后不会放了。
二刷思路:
有个zip函数好像更适合这个场景,一刷对于这个函数还不是很掌握。先用简单的思路实现。