【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鼓励开发者从用户的角度出发,先定义期望的结果,再进行实际的开发。这种方法不仅可以确保代码满足预期的需求,还可以在整个开…

IBM Db2 笔记

目录 1. IBM Db2 笔记1.1. 常用命令1.2. 登录命令行模式 (Using the Db2 command line processor)1.3. issue1.3.1. db2: command not found/SQL10007N Message "-1390" could not be retreived. Reason code: "3".1.3.2. db2 修改 dbm cfg 的时候报 SQL50…

C++ Day4

目录 一、拷贝赋值函数 1.1 作用 1.2 格式 二、匿名对象 2.2 格式 三、友元 3.1作用 3.2格式 3.3 种类 3.4 全局函数做友元 3.5类做友元 3.6 成员函数做友元 3.7注意 四、常成员函数和常对象 4.1 常成员函数 4.1.1格式 示例&#xff1a; 4.2 常对象 作用&…

shell学习笔记(详细整理)

主要介绍&#xff1a;主要是常用变量&#xff0c;运算符&#xff0c;条件判断&#xff0c;流程控制&#xff0c;函数&#xff0c;常用shell工具(cut,sed,awk,sort)。 一. Shell概述 程序员为什么要学习Shell呢&#xff1f; 1&#xff09;需要看懂运维人员编写的Shell程序。 2…

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

出资者在进行股票出资和基金出资的时分&#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、创建一个计算字段“年龄”,如下图…

ChatGPT:ChatGPT 的发展史,ChatGPT 优缺点以及ChatGPT 在未来生活中的发展趋势和应用

目录 1.ChatGPT 是什么 2. ChatGPT 的发展史 3.ChatGPT 优缺点 4.ChatGPT 在未来生活中的发展趋势和应用 5.ChatGPT经历了几个版本 1.ChatGPT 是什么 ChatGPT 是一个在线聊天机器人&#xff0c;可以与使用者进行语义对话和提供帮助。它可以回答各种问题&#xff0c;提供建议…

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

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

按斤称的C++散知识

一、多线程 std::thread()、join() 的用法&#xff1a;使用std::thread()可以创建一个线程&#xff0c;同时指定线程执行函数以及参数&#xff0c;同时也可使用lamda表达式。 #include <iostream> #include <thread>void threadFunction(int num) {std::cout <…

SpringBoot整合FFmpeg进行视频分片上传(Linux)

SpringBoot整合FFmpeg进行视频分片上传&#xff08;Linux&#xff09; 上传的核心思路&#xff1a; 1.将文件按一定的分割规则&#xff08;静态或动态设定&#xff0c;如手动设置20M为一个分片&#xff09;&#xff0c;用slice分割成多个数据块。 2.为每个文件生成一个唯一标识…

给计算机专业准大学生的一些建议

随着互联网的发展&#xff0c;计算机专业也越来越受到了广泛的关注。在这个信息爆炸的时代&#xff0c;互联网为计算机专业的学生提供了更多的机遇和挑战。那么&#xff0c;对于目前互联网形式给计算机专业准大学生&#xff0c;我想分享以下几个建议。 一、掌握基础知识 在学…

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

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

【python】学习笔记(自用持续补充)

基础语法 每行代码无需用&#xff1b;隔开&#xff0c;通过缩进表示代码结构&#xff0c;按行编译 输出 print() 可以通过将不同的字符串连接起来 只能连接字符串&#xff0c;如果需要将字符串和数字同时用连接输出&#xff0c;需要进行格式转换 “ ”互相配对&#xff0c;…

PID直观感受简述

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

java.lang.reflect.InvocationTargetException:null报未知异常

在项目上线过程中&#xff0c;突然出现大量异常信息&#xff0c;堆栈信息如下&#xff1a; java.lang.reflect.InvocationTargetException: null at jdk .internal.reflect.GeneratedMethodAccessor792 .invoke(Unknown Source) ~[?:?] at jdk.internal.reflect.DelegatingM…

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是可以在常…

HashMap存储自定义类型键值

HashMap存储自定义类型键值Map集合保证key是唯一的&#xff1a;作为key的元素&#xff0c;必须重写hashCode方法和equals方法&#xff0c;以保证key唯一 package collection;import java.util.HashMap; import java.util.Map; import java.util.Objects; import java.util.Set;…