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

news/2024/11/24 23:41:38/

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

        • 1. 前言
        • 2. 1657. 确定两个字符串是否接近
        • 3. 1004. 最大连续1的个数 III
        • 4. 总结

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 Falsemap1 = {}map2 = {}for c in word1:map1[c] = map1.get(c,0) + 1for c in word2:map2[c] = map2.get(c,0) + 1arr = []for key in map1:if not map2.get(key,None):return Falseelse: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 Trueprint(map1,map2)if len(map1.keys()) != len(map2.keys()):return Falsecount = 0n2=  len(map1.keys())for key in map1:if map2.get(key,None):count += 1if count != n2:return Falselist1 = 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 Falsereturn Truea = 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,0count = 0res = -1while left < n and right < n:if count > k:if nums[left] == 0:count -= 1left += 1if nums[right] == 0:count += 1if count <= k:res = max(res,right-left)right += 1return res + 1a = Solution()
print(a.longestOnes([1,1,1,0,0,0,1,1,1,1,0],2))

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

4. 总结

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


http://www.ppmy.cn/news/1005935.html

相关文章

Istio 安全 mTLS认证 PeerAuthentication

这里定义了访问www.ck8s.com可以使用http也可以使用https访问&#xff0c;两种方式都可以访问。 那么是否可以强制使用mtls方式去访问&#xff1f; mTLS认证 PeerAuthentication PeerAuthentication的主要作用是别人在和网格里的pod进行通信的时候&#xff0c;是否要求mTLS mTL…

K8S 部署 RocketMQ

文章目录 添加模板部署本地访问 集群使用 kubesphere 作为工具 添加模板 添加 helm 模板 helm repo add rocketmq-repo https://helm-charts.itboon.top/rocketmq helm repo update rocketmq-repo编写 value.yaml 文件 配置主从节点的个数&#xff0c;例子为单节点 broker:…

安科瑞智能仪表在户用光伏,工商业光伏,地面光伏,光电建筑的应用

光伏储能逆变器 应用场景 户用储能&#xff0c;小型工商业储能&#xff0c;微电网储能 功能 1.对电能参数进行采样计量和监测&#xff0c;逆变器或者能量管理系统&#xff08;EMS&#xff09;与之进行通讯&#xff0c;根据实时功率及累计电能实现防逆流、调节发电量、电池充…

209. 长度最小的子数组 Python

文章目录 一、题目描述示例 1示例 2示例 3 二、代码三、解题思路 一、题目描述 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;并返回其长度。如果不存在…

Vue 路由 router 配置(四)

一、下载 router 组件 1.1 删除文件 先把第三小节里面默认生成的文件删除干净&#xff0c;只剩下 main.js 和 App.vue&#xff0c;内容如下所示&#xff1a; import Vue from vue import App from ./AppVue.config.productionTip false;new Vue({el: #app,components…

电教智能云数据可视化平台开发电能优化日志实录

电教智能云数据可视化平台开发电脑优化日志实录 一、2K和4K弹窗判断二、电能API对接1.电脑爬虫2.电能分组过滤3.数据可视化渲染4.弹窗 三.数组按顺序输出 一、2K和4K弹窗判断 {* 判断2k和4k弹窗 *}{if $dataScene[scene_standard] eq 0}<a class"menuBtn subMenu"…

DAY3,C高级(shell中的变量、数组、算术运算、分支结构)

1.整理思维导图&#xff1b; 2.判断家目录下&#xff0c;普通文件的个数和目录文件的个数&#xff1b; 1 #!/bin/bash2 arr1(ls -la ~/ | cut -d r -f 1 | grep -w -)3 arr2(ls -la ~/ | cut -d r -f 1 | grep -w d)4 echo "普通文件个数&#xff1a;${#arr1[*]}"5 e…

JavaScript 原型链解析,宏任务和微任务

目录 什么是原型链&#xff1f; 原型与构造函数 原型链的工作原理 实例&#xff1a;理解原型链 宏任务&#xff08;Macro Task&#xff09; 微任务&#xff08;Micro Task&#xff09; 什么是原型链&#xff1f; JavaScript 是一门基于原型的语言&#xff0c;而原型链是…