【python】Leetcode(primer-set)

在这里插入图片描述

文章目录

  • 78. 子集(集合的所有子集)
  • 90. 子集 II(集合的所有子集)
  • 792. 匹配子序列的单词数(判断是否为子集)
  • 500. 键盘行(集合的交集)
  • 409. 最长回文串(set)

更多 leetcode 题解可参考:【Programming】


78. 子集(集合的所有子集)

给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

说明:解集不能包含重复的子集

在这里插入图片描述
思路:可以迭代,可以回溯,
算 1 的子集的时候,新增 1 结合 空集;
算 2 的子集的时候,2 结合 1 的所有子集;
算 3 的子集的时候,3 结合 2 的所有子集

class Solution(object):def subsets(self, nums):""":type nums: List[int]:rtype: List[List[int]]"""result = [[]]for i in nums:result.extend([j + [i] for j in result])return result

相似题目 1863. 找出所有子集的异或总和再求和


90. 子集 II(集合的所有子集)

给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

说明:解集不能包含重复的子集。
在这里插入图片描述
思路:和 78 唯一不同的是 nums 可能包含一样的元素,这个时候就会存在 [1,2] 和 [2,1] 或者更难一点的 [1,2,2] 和 [2,1,2] 的情况,78 的解法这两个都会保留(78中元素不一样),但是这题只能保留其中一种!
简单的 set 好像排除不了,我用的是 sorted

class Solution(object):def subsetsWithDup(self, nums):""":type nums: List[int]:rtype: List[List[int]]"""result = [[]]for i in nums:result.extend([j + [i] for j in result])set1 = set(tuple(sorted(item)) for item in result) # tuple 才能 hash——set,sorted 配合set来去重list1 = list(list(item) for item in set1)# 转化成输出的格式return list1

792. 匹配子序列的单词数(判断是否为子集)

给定字符串 S 和单词字典 words, 求 words[i] 中是 S 的子序列的单词个数。

  • 示例:
    输入:
    S = “abcde”
    words = [“a”, “bb”, “acd”, “ace”]
    输出: 3
    解释: 有三个是 S 的子序列的单词: “a”, “acd”, “ace”。
    注意:

所有在words和 S 里的单词都只由小写字母组成。
S 的长度在 [1, 50000]。
words 的长度在 [1, 5000]。
words[i]的长度在[1, 50]。

思路:in 或者 find 都不能判断这种跨越的子集,暴力法遍历了

class Solution(object):def numMatchingSubseq(self, S, words):""":type S: str:type words: List[str]:rtype: int"""count = 0for item in words:i = 0j = 0flag = 0while(i<len(S) and j<len(item)):if S[i] == item[j]:i+=1j+=1if j==len(item):breakelse:i+=1if i>len(item) and item[j] not in S: # 根本不在S中就不浪费表情去一个一个滑动找了breakif j == len(item):count+=1return count

但是超时了!字典树!

class Solution(object):def numMatchingSubseq(self, S, words):""":type S: str:type words: List[str]:rtype: int"""import collectionswaiting = collections.defaultdict(list)for w in words:waiting[w[0]].append(iter(w[1:]))for c in S:# print('c', c)# Python 字典 pop() 方法删除字典给定键 key 所对应的值,返回值为被删除的值。key值必须给出。 否则,返回default值。# 把所有以c开头的word都删除for it in waiting.pop(c, ()):# 如果这个word还有其他字母,则与之前的合并,否则放到None中,表示该word能匹配waiting[next(it, None)].append(it)return len(waiting[None])

500. 键盘行(集合的交集)

给定一个单词列表,只返回可以使用在键盘同一行的字母打印出来的单词。键盘如下图所示。

在这里插入图片描述

  • 示例:
    输入: [“Hello”, “Alaska”, “Dad”, “Peace”]
    输出: [“Alaska”, “Dad”]

  • 注意:
    你可以重复使用键盘上同一字符。
    你可以假设输入的字符串将只包含字母。

思路:暴力法,比较每一个字母是否在键盘的三行中

class Solution(object):def findWords(self, words):""":type words: List[str]:rtype: List[str]"""s1 = "qwertyuiop"s2 = "asdfghjkl"s3 = "zxcvbnm"result = []for word in words: # 遍历单词item = set(word.lower())num1 = 0num2 = 0num3 = 0for i in item:if i in s1:num1+=1elif i in s2:num2+=1else:num3+=1if num1==len(item) or num2==len(item) or num3==len(item):result.append(word)return result

还可以用集合的交集(和三行的交集是否为本身,是的话就表示该 string 是由一行键盘打出来的),这样就不用两层循环了!

class Solution(object):def findWords(self, words):""":type words: List[str]:rtype: List[str]"""s1 = "qwertyuiop"s2 = "asdfghjkl"s3 = "zxcvbnm"result = []for word in words: # 遍历单词if set(word.lower()) & set(s1) == set(word.lower()) or\set(word.lower()) & set(s2) == set(word.lower()) or \set(word.lower()) & set(s3) == set(word.lower()):result.append(word)return result

在这里插入图片描述

拓展,集合的并集 | 集合的差 -


409. 最长回文串(set)

给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。

在构造过程中,请注意区分大小写。比如 “Aa” 不能当做一个回文字符串。

  • 注意:
    假设字符串的长度不会超过 1010。

  • 示例 1:
    输入:
    “abccccdd”
    输出:
    7

  • 解释:
    我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。


思路:先用 set 统计每个元素的数量,偶数的可以直接算作回文串的子集,奇数减1成偶数让其构成回文串子集(如果元素数量是1,减去后就为0)!最后输出结果,把子集拼起来,+1 即可,如果子集拼起来的长度和原字符串的长度相等,就不用加1了!

class Solution(object):def longestPalindrome(self, s):""":type s: str:rtype: int"""set1 = set(s)number_list = []sum1 = 0for i in set1: # 统计每个元素的数量number_list.append(s.count(i))for i,j in enumerate(number_list): # 遍历数量,偶数不变,奇数减一if j % 2 == 1:number_list[i] -= 1sum1 += number_list[i]if sum1+1 > len(s): # 这里避免,bb 的情况return len(s)else:return sum1+1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/52630.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

测试先行:探索测试驱动开发的深层价值

引言 在软件开发的世界中,如何确保代码的质量和可维护性始终是一个核心议题。测试驱动开发(TDD)为此提供了一个答案。与传统的开发方法相比,TDD鼓励开发者从用户的角度出发,先定义期望的结果,再进行实际的开发。这种方法不仅可以确保代码满足预期的需求,还可以在整个开…

恒运资本:什么是股票分红和基金分红?两者有什么区别?

出资者在进行股票出资和基金出资的时分&#xff0c;能够参与股票分红或许基金分红&#xff0c;可是许多新手对分红不是很了解。那么什么是股票分红和基金分红&#xff1f;两者有什么区别&#xff1f;下面就由恒运资本为大家分析&#xff1a; 什么是股票分红和基金分红&#xff…

LeGO-Loam代码解析(二)--- Lego-LOAM的地面点分离、聚类、两步优化方法

1 地面点分离剔除方法 1.1 数学推导 LeGO-LOAM 中前端改进中很重要的一点就是充分利用了地面点,那首先自然是提取 对地面点的提取。 如上图,相邻的两个扫描线束的同一列打在地面上如 点所示,他们的垂直高度差 &#xff0c;水平距离差 &#xff0c;计算垂直高度差和水平高度差…

n5173b是德科技keysight N5173B信号发生器

产品概述 是德科技/安捷伦N5173B EXG模拟信号发生器 当您需要平衡预算和性能时&#xff0c;是德科技N5173B EXG微波模拟信号发生器是经济高效的选择。它提供解决宽带滤波器、放大器、接收机等参数测试的基本信号。执行基本LO上变频或CW阻塞&#xff0c;低成本覆盖13、20、31.…

Dynamic CRM开发 - 实体字段(三)计算字段

在 Dynamic CRM开发 - 实体字段(一)中提到了实体字段的属性字段类型:有简单、计算、汇总三种,本篇幅通过一个示例讲解计算字段。 有这样一个需求:根据用户填写的出生日期,计算年龄。 1、创建一个“出生日期”字段,时间类型即可。 2、创建一个计算字段“年龄”,如下图…

数据库(DQL,多表设计,事务,索引)

目录 查询数据库表中数据 where 条件列表 group by 分组查询 having 分组后条件列表 order by 排序字段列表 limit 分页参数 多表设计 一对多 多对多 一对一 多表查询 事物 索引 查询数据库表中数据 关键字&#xff1a;SELECT 中间有空格&#xff0c;加引…

【C++】—— C++11新特性之 “右值引用和移动语义”

前言&#xff1a; 本期&#xff0c;我们将要的介绍有关 C右值引用 的相关知识。对于本期知识内容&#xff0c;大家是必须要能够掌握的&#xff0c;在面试中是属于重点考察对象。 目录 &#xff08;一&#xff09;左值引用和右值引用 1、什么是左值&#xff1f;什么是左值引用…

PID直观感受简述

0、仿真控制框图 1、增加p的作用&#xff08;增加响应&#xff09;P 2、增加I的作用&#xff08;消除稳差&#xff09;PI 3、增加D的作用&#xff08;抑制波动&#xff09;PID 加入对噪声很敏 4、综合比对

linux中定时器的使用

在Linux中&#xff0c;可以使用timer_create、timer_settime和timer_delete等函数来创建和管理定时器。下面是一个简单的示例程序&#xff0c;演示如何在Linux中使用定时器&#xff1a; #include <stdio.h> #include <stdlib.h> #include <signal.h> #inclu…

STL---list

目录 1. list的介绍及使用 1.1 list的介绍 1.2 list的使用注意事项 2.list接口介绍及模拟实现 2.1构造​编辑 2.2容量 2.3修改 3.list迭代器 4.迭代器失效 5.模拟实现 6.vector和list的区别 1. list的介绍及使用 1.1 list的介绍 list的文档介绍 1. list是可以在常…

数据库第十七课-------ETL任务调度系统的安装和使用

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

Jenkins配置远程服务器SSH Server流程

说明&#xff1a;以阿里云轻量应用服务器&#xff0c;本文介绍如何在Jenkins中配置远程服务器&#xff0c;Jenkins安装参考这篇文章&#xff1b; 第一步&#xff1a;启动服务 首先&#xff0c;启动Jenkins容器&#xff0c;进入Jenkins管理后台&#xff0c;点击系统配置&#…

echarts 的dataZoom滑块两端文字被遮挡

问题&#xff1a; 期望&#xff1a; 解决方案&#xff1a; 1&#xff1a;调整宽度&#xff08;4版本的没有width属性&#xff09; 2. 参考&#xff1a;echarts图标设置dataZoom拖拽时间轴时自动调整两侧文字的位置_datazoom 位置_乌栖曲的博客-CSDN博客 设置文字的定位 cons…

物联网(IoT)安全挑战与解决方案: 分析物联网设备面临的安全威胁,以及如何设计和管理安全的IoT生态系统

第一章&#xff1a;引言 随着科技的飞速发展&#xff0c;物联网&#xff08;IoT&#xff09;作为连接世界的桥梁&#xff0c;已经成为现代社会不可或缺的一部分。然而&#xff0c;随着IoT设备数量的不断增加&#xff0c;其安全问题也日益显著。本文将深入探讨IoT领域面临的安全…

暄桐展览| 我们桐学有自己的习作展(1)

林曦老师《从书法之美到生活之美》的第五阶课程《静定的滋养2021》已告一段落。570天的用功&#xff0c;桐学们的技艺都有了水涨船高的进益。      无论书法课&#xff08;全阶和五阶&#xff09;还是国画课&#xff0c;暄桐都有一套完整系统的教学体系&#xff0c;也会在桐…

Java | IDEA中Netty运行多个client的方法

想要运行多个client但出现这种提示&#xff1a; 解决方法 1、打开IDEA&#xff0c;右上角找到下图&#xff0c;并点击 2、勾选

微信支付

文档地址&#xff1a;https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter9_1 封装的工具类 package com.qf.fmall.utils;import cn.hutool.core.util.XmlUtil; import cn.hutool.http.HttpRequest; import org.apache.shiro.crypto.hash.Md5Hash;import java.util.…

【keepalived双机热备与 lvs(DR)】

目录 一、概述 1.简介 2.原理 3.作用 二、安装 1.配置文件 2.配置项 三、功能模块 1.core 2.vrrp 3.check 四、配置双机热备 1.master 2.backup 五、验证 1.ping验证 2.服务验证 六、双机热备的脑裂现象 七、keepalivedlvs&#xff08;DR&#xff09; 1.作…

性能测试告诉你 mysql 数据库存储引擎该如何选?

简介 数据库存储引擎&#xff1a;是数据库底层软件组织&#xff0c;数据库管理系统&#xff08;DBMS&#xff09;使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能&#xff0c;使用不同的存储引擎&#xff0c;还可以…

Wireshark数据抓包分析之互联网控制报文协议_ICMP

一、实验目的: 通过使用wireshark抓取的ICMP数据包对这个ICMP控制报文进行分析 二、预备知识&#xff1a; 1.ICMP协议概述&#xff1a;ICMP是Internet Control Message Protocol的缩写&#xff0c;即互联网控制报文协议。它是TCP/IP协议族的一个子协议&#xff0c;用于IP主机、…