leetcode刷题:1657. 确定两个字符串是否接近、1004. 最大连续1的个数 III

leetcode刷题:1657. 确定两个字符串是否接近、1004. 最大连续1的个数 III

1. 前言

上述两个题目位于leetcode75中,难度为中等,虽然对于大佬而言,可能很简单,但是对于我而言,可能说还是有一些挑战性的。最后提交效率不怎么高,希望各位谅解。
请添加图片描述

2. 1657. 确定两个字符串是否接近

标签: 哈希表、字符串、排序
题目如下:
如果可以使用以下操作从一个字符串得到另一个字符串,则认为两个字符串 接近 :

  • 操作 1:交换任意两个 现有 字符。
    例如,abcde -> aecdb
  • 操作 2:将一个 现有 字符的每次出现转换为另一个 现有 字符,并对另一个字符执行相同的操作。
    例如,aacabb -> bbcbaa(所有 a 转化为 b ,而所有的 b 转换为 a )
    你可以根据需要对任意一个字符串多次使用这两种操作。

给你两个字符串,word1 和 word2 。如果 word1 和 word2 接近 ,就返回 true ;否则,返回 false 。
示例如下:
请添加图片描述
算法思路(Python):对于无论多么复杂的word1,如果能通过上述两种操作转换为word2。首先先把word1、word2用两个哈希表map1、map2分别用来统计两个字符串中各个字符的个数。先处理操作1,即遍历map1中的key,如果key也在map2中,且map1[key]==map2[key],那么说明word1、word2中字符key中个数相同,可以证明的是在word1中字符key无论在字符串word1哪些位置上,都可以通过操作1转换到word2中key对应位置(虽然不知道怎样证明),记下这些key,遍历完map1之后,删除map1和map2中的这些key。进行完这些操作之后,如果两个哈希表全为空,那么说明word1转换为word2只需操作1即可,返回True。如果两个哈希表中键的个数不相等,直接返回False;如果两个哈希表中键不一一对应,那么也返回False(即如果键a在map1中,那么键a也需在map2中);(进行操作2)之后将两个哈希表中值得到,用list1、list2分别进行存储,对list1、list2进行排序,然后比较list1、list2中值是否相同,只要其中一个不同,那么False,否则最后返回True。

参考代码如下:

class Solution(object):
    def closeStrings(self, word1, word2):
        """
        :type word1: str
        :type word2: str
        :rtype: bool
        """

        m = len(word1)
        n = len(word2)
        if m != n:
            return False
        map1 = {
    
    }
        map2 = {
    
    }
        for c in word1:
            map1[c] = map1.get(c,0) + 1
        for c in word2:
            map2[c] = map2.get(c,0) + 1
        arr = []
        for key in map1:
            if not map2.get(key,None):
                return False
            else:
                if map2[key] == map1[key]:
                    arr.append(key)

        for key in arr:
            map1.pop(key)
            map2.pop(key)

        if len(map1.keys()) == 0 and len(map2.keys()) == 0:
            print('第一种情况')
            return True

        print(map1,map2)
        if len(map1.keys()) != len(map2.keys()):
            return False

        count = 0
        n2=  len(map1.keys())
        for key in map1:
            if map2.get(key,None):
                count += 1
        if count != n2:
            return False

        list1 = list(map1.values())
        list2 = list(map2.values())

        list1.sort()
        list2.sort()
        print(list1,list2)
        for i in range(n2):
            if list1[i] != list2[i]:
                return False

        return True



a = Solution()
print(a.closeStrings(word1 = "abbzzca", word2 = "babzzcz"))

运行结果:
请添加图片描述

3. 1004. 最大连续1的个数 III

标签:双指针滑动窗口、数组
题目描述如下:
给定一个二进制数组 nums 和一个整数 k,如果可以翻转最多 k 个 0 ,则返回 数组中连续 1 的最大个数 。
示例如下:
请添加图片描述

算法思路:应用双指针(left、right)、滑动窗口。这一题中,用一个变量count用于统计当前滑动窗口中的0的个数,如果count小于或者等于k,那么此时连续1的最大个数为right-left+1,如果count大于k,(如果nums[left] == 0,count个数减1),left++。
画出示例1的运行示意图如下:

nums = [1,1,1,0,0,0,1,1,1,1,0], k = 2
left=0,right=0,1,count=0,res=1
left=0,right=1,11,count=0,res=2
left=0,right=2,111,count=0,res=3
left=0,right=3,1110,count=1,res=4
left=0,right=4,11100,count=2,res=5
left=1,right=5,11000,count=3,res=5
left=2,right=6,10001,count=3,res=5
left=2,right=6,10001,count=3,res=5
left=3,right=7,00011,count=3,res=5
left=4,right=8,00111,count=2,res=5
left=4,right=9,001111,count=2,res=6
left=4,right=10,0011110,count=3,res=6

黄色部分表示滑动串口窗口中的字符串。
参考代码如下:

class Solution(object):
    def longestOnes(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: int
        """
        n = len(nums)
        left,right=0,0
        count = 0
        res = -1
        while left < n and right < n:
            if count > k:
                if nums[left] == 0:
                    count -= 1
                left += 1

            if nums[right] == 0:
                count += 1

            if count <= k:
                res = max(res,right-left)
            right += 1

        return res + 1

a = Solution()
print(a.longestOnes([1,1,1,0,0,0,1,1,1,1,0],2))

运行结果:
请添加图片描述

4. 总结

总的来说,题目还算简单(想明白的话,哈哈!),至于效率不怎么高,和使用编程语言和提交代码时间段还是有一定关联的。

猜你喜欢

转载自blog.csdn.net/qq_45404396/article/details/132115104