LeetCode 1790. 仅执行一次字符串交换能否使两个字符串相等-可心科创工作室缩略图

给你长度相等的两个字符串 s1 和 s2 。一次 字符串交换 操作的步骤如下:选出某个字符串中的两个下标(不必不同),并交换这两个下标所对应的字符。

如果对 其中一个字符串 执行 最多一次字符串交换 就可以使两个字符串相等,返回 true ;否则,返回 false 。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/check-if-one-string-swap-can-make-strings-equal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

LeetCode 1790. 仅执行一次字符串交换能否使两个字符串相等-可心科创工作室插图
OpenCV步步精深-可心科创工作室

思路:首先哈希表得相同,其次只能有两个字符位置不同

python3实现:

class Solution:
    def areAlmostEqual(self, s1: str, s2: str) -> bool:
        # 哈希表确定两个字符串元素相同,且只有两个字符串位置不同,才返回true

        dic_s1 = collections.Counter(s1)
        dic_s2 = collections.Counter(s2)

        if dic_s1 == dic_s2:
            count = 0
            p = 0
            while p <= len(s1) - 1:
                if s1[p] != s2[p]:
                    count += 1

                p += 1
                if count > 2:
                    return False

            if count <= 2:
                return True

        else:
            return False
LeetCode 1790. 仅执行一次字符串交换能否使两个字符串相等-可心科创工作室插图1
OpenCV步步精深-可心科创工作室

优化一下,直接用指针

class Solution:
    def areAlmostEqual(self, s1: str, s2: str) -> bool:
        count = 0
        p = 0
        idx = []
        while p <= len(s1) - 1:
            if s1[p] != s2[p]:
                count += 1
                if s1[p] not in s2:
                    return False
                if s1[p] not in idx:
                    idx.append(s1[p])
                if s2[p] not in idx:
                    idx.append(s2[p])
            if count > 2:
                return False
            p += 1
        if count == 0:
            return True
        if count == 2 and len(idx) == 2:
            return True
            
        return False
LeetCode 1790. 仅执行一次字符串交换能否使两个字符串相等-可心科创工作室插图2
OpenCV步步精深-可心科创工作室

更多干货见 OpenCV步步精深

溜了溜了!

作者 admin

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注