力扣leecode-python解法笔记之1790. 仅执行一次字符串交换能否使两个字符串相等

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的时候 顺序需要相同。直接排序会导致时间复杂度提高了,暂时没有想到更好的解决方案。

力扣leecode-python解法笔记之1790. 仅执行一次字符串交换能否使两个字符串相等_第1张图片

PS:这个排名没什么卵用  刷新一下就是新世界。之后不会放了。

二刷思路:

有个zip函数好像更适合这个场景,一刷对于这个函数还不是很掌握。先用简单的思路实现。

 

你可能感兴趣的:(leetcode,算法,职场和发展)