北大硕士LeetCode算法专题课-字符串相关问题

news2025/1/18 18:54:28

算法面试相关专题:

北大硕士LeetCode算法专题课-数组相关问题_骨灰级收藏家的博客-CSDN博客

北大硕士LeetCode算法专题课---算法复杂度介绍_骨灰级收藏家的博客-CSDN博客

北大硕士LeetCode算法专题课-基础算法之排序_骨灰级收藏家的博客-CSDN博客

反转字符串(LeetCode344)

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

反转字符串(LeetCode344)——方法一:双指

解题思路:

left 指向字符数组首元素right 指向字符数组尾元素。

left < right

交换 s[left] s[right]

left 指针右移一位,即 left = left + 1

right 指针左移一位,即 right = right – 1

left >= right反转结束,返回字符数组即可。

class Solution(object):
def reverseString(self, s):  """
:type s: List[str]
:rtype: None Do not return anything, modify s in-place instead.  """
l, r = 0, len(s) - 1
while l < r:
s[l], s[r] = s[r], s[l]  l += 1
r -= 1

 复杂度分析时间复杂度:O(n),其中 N 为字符数组的长度。一共执行了 N/2 次的交换。 空间复杂度:O(1) 。

反转字符串(LeetCode344)——方法二:单指

解题思路:

指针指向最左侧

left < 字符串长度/2:交换 s[left] s[-left-1], 相当于第一个跟倒数第一交换, 第二跟与倒数第二交换

l  当 left >= 字符串长度/2,反转结束,返回字符数组即可。

class Solution(object):
def reverseString(self, s):  """
:type s: List[str]
:rtype: None Do not return anything, modify s in-place instead.  """
for i in range(len(s) // 2):
s[i], s[-i - 1] = s[-i - 1], s[i]

 复杂度分析时间复杂度:O(n),其中 N 为字符数组的长度。一共执行了 N/2 次的交换。 空间复杂度:O(1) 。

验证回文串(LeetCode 125)

给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写

 解法1: 对字符串进行遍历, 只保留数字和字母, 将结果保存到新的字符串s_中。 此时只需判断新的字符串s_ 与其逆序是否相同 如果相同则为回文串。

def isPalindrome(s):
# isalnum 为Python自带API, 判断当前字符是否是数字或者字母 s_ = "".join(ch.lower() for ch in s if ch.isalnum())  return s_ == s_[::-1]

解法1优化: 对字符串进行遍历, 只保留数字和字母, 将结果保存到新的字符串s_中。将新字符串是否为回文的判断改用双指针 实现

 

def isPalindrome2(s):
s_ = "".join(ch.lower() for ch in s if ch.isalnum())  n = len(s_)
left, right = 0, n - 1

while left < right:
if s_[left] != s_[right]:
return False
left, right = left + 1, right - 1
return True

时间复杂度:O(|s|),其中 |s| 是字符串 s 的长度。

空间复杂度:O(|s|)。在最坏情况下,新的字符串 s_ 与原字符串 s完全相同,因此需要使用 O(|s|) 的空间。

无重复字符的最长子串(LeetCode 3)

一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1

输入:s = "abcabcbb"

输出:3

解释:因为无重复字符的最长子串是 "abc",所以其长度为 3

解法1: 暴力解法

①找到所有的子串 O(n2)

②确定子串是否有重复字符O(n)

解法2: 滑动窗口

 创建Set 用来记录出现的字符,

在字符串长度范围以内, 窗口内没有出现重复字符, 窗口右侧向右滑动窗口, 并用Set记录窗口内增加的字符

 

def lengthOfLongestSubstring(s):
# 哈希集合,记录每个字符是否出现过
occ = set()  n = len(s)
# 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动
rk, ans = -1, 0
for i in range(n):
if i != 0:
# 左指针向右移动一格,移除一个字符
occ.remove(s[i - 1])
while rk + 1 < n and s[rk + 1] not in occ:
# 不断地移动右指针
occ.add(s[rk + 1])
rk += 1
# 第 i 到 rk 个字符是一个极长的无重复字符子串
ans = max(ans, rk - i + 1)
return ans

 时间复杂度O(n)

字符串中的第一个唯一字符(LeetCode387)

给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1

示例 1

s = "leetcode"

返回 0

s = "loveleetcode"

返回 2

字符串中的第一个唯一字符(LeetCode387)——方法一:使用哈希表存储频

思路及算

对字符串进行两次遍历:

在第一次遍历时,我们使用哈希映射统计出字符串中每个字符出现的次数

在第二次遍历时,我们只要遍历到了一个只出现一次的字符,那么就返回它的索引,否则在遍历结束后返回 -1。

class Solution:
def firstUniqChar(self, s: str) -> int:  frequency = collections.Counter(s)  for i, ch in enumerate(s):
if frequency[ch] == 1:
return i
return -1

复杂度分析时间复杂度:O(n),其中 n 是字符串 s 的长度。我们需要进行两次遍历。

空间复杂度:O(∣Σ∣),其中 Σ 是字符集,在本题中 s 只包含小写字母,因此 ∣Σ∣≤26。我们需要 O(∣Σ∣) 的        

思路及算

创建一个字典(哈希表),键表示一个字符,值表示它的首次出现的索引(如果该字符只出现一次)或者 -1(如果该字 符出现多次)。

第一次遍历字符串时,设当前遍历到的字符为 c,如果 c 不在哈希映射中,我们就将 c 与它的索引作为一个键值对加 入哈希映射中,否则我们将 c 在哈希映射中对应的值修改为 -1。

在第一次遍历结束后,只需要再遍历一次哈希映射中的所有值,找出其中不为 -1 的最小值,即为第一个不重复字符的 索引。如果哈希映射中的所有值均为 -1,我们就返回 -1。

def firstUniqChar2(s):  position = dict()  n = len(s)
for i, ch in enumerate(s):
if ch in position:  position[ch] = -1
else:
position[ch] = i  first = n
for pos in position.values():
if pos != -1 and pos < first:  first = pos
if first == n:  first = -1
return first

 有效的字母异位词(LeetCode242)

给定两个字符串 s t ,编写一个函数来判断 t 是否是 s 的字母异位词。

注意:若 s t 中每个字符出现的次数都相同,则称 s t 互为字母异位词。

 

有效的字母异位词(LeetCode242) ——方法一:

t s的异位词等价于「两个字符串排序后相等」。因此我们可以对字符串 s t 分别排序,看排序后的字符串是否相等 即可判断。此外,如果 s t 的长度不同,t 必然不是 s 的异位词。

class Solution1(object):
def isAnagram(self, s, t):  """
:type s: str
:type t: str
:rtype: bool  """
return sorted(s) == sorted(t)

时间复杂度O(nlogn)其中 n s 的长度。排序的时间复杂度O(nlogn)比较两个字符串是否相等时间复杂度O(n),  因此总体时间复杂度Onogn+n=Onogn)l()l(

空间复杂度:O(logn)。排序需要 O(logn) 的空间复杂度。

有效的字母异位词(LeetCode242) ——方法二:哈希

从另一个角度考虑,t 是 s 的异位词等价于「两个字符串中字符出现的种类和次数均相等」。由于字符串只包含 26 个小写字母,因此我们可以维护一个长度为 26 的频次数组 table先遍历记录字符串 s 中字符出现的频次,  然后遍历字符串 t,减去 table 中对应的频次,如果出现 table[i]<0,则说明 t 包含一个不在 s 中的额外字符,返回 false 即可。

 

def isAnagram(s, t):  a = [0] * 26
for i in s:
a[ord(i)-ord('a')] += 1
for j in t:
if a[ord(j)-ord('a')] == 0:
return False
else:
a[ord(j)-ord('a')] -= 1
for i in range(26):
if a[i]!=0:
return False
return True

  字母异位词分组(LeetCode 49)

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次

给两个字符串互为字母异位词时,两个字符串包含的字母相同。

可使用这一组相同的字母作为一组字母异位词的标志(dict key)使用dict存储每一组字母异位词

解法1: 对每个字符串排序, 排序之后相同的为字母异位词, 将排序之后结果作为dict key 

def groupAnagrams(strs):
mp = collections.defaultdict(list)

for st in strs:
key = "".join(sorted(st))  mp[key].append(st)

return list(mp.values())

时间复杂度O(nklogk)其中 n strs 中的字符串的数量,k strs 中的字符串的的最大长度。需 要遍历 n 个字符串,对于每个字符串,需要 O(klogk) 的时间进行排序以及 O(1)的时间更新哈希表,  因此总时间复杂度是 O(nklogk)空间复杂度O(nk)

解法2:将每个字母出现的次数作为哈希表(dict) key

def groupAnagrams2(strs):
mp = collections.defaultdict(list)

for st in strs:  counts = [0] * 26  for ch in st:
counts[ord(ch) - ord("a")] += 1
# 需要将 list 转换成 tuple 才能进行哈希
mp[tuple(counts)].append(st)

return list(mp.values())

时间复杂度O(n(k+ Σ ))其中 n strs 中的字符串的数量,k strs 中的字符串的的最大长度,

Σ 是字符集,在本题中字符集为所有小写字母, Σ =26。需要遍历 n个字符串,对于每个字符串,  需要 O(k)的时间计算每个字母出现的次数O( Σ ) 的时间生成哈希表的键,以及 O(1)的时间更新

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

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

相关文章

springcloud3 Nacos的服务搭建和生产消费案例

一 nacos 1.1 nacos概念 Nacos是服务注册发现中心配置中心的组合。比eurka实现的功能更加强大。 nacos默认均有负载均衡的功能&#xff0c;集成了netflix的ribbon代码包。 1.2 nacos与其他进行对别 1.3 nacos的配置 1.4 namespace和group和dataid之间的关系 二 nacos的安…

2023年网络工程师必备10大软件,最新安装包分享

常听人说&#xff1a;拳头再硬&#xff0c;也比不上锤子&#xff01;同样的&#xff0c;作为一个网络工程师只有满腹的技术而不会使用对应的软件工具&#xff0c;是完全不行的。那作为一个2023年的网络工程师必备的软件有哪些呢&#xff1f;以下10大网工必备软件都已整理好安装…

smsalarm怎么读取intouch系统平台的点

有两种方式&#xff0c;分别是DDE和OPC方式 DDE方式 在SMC里面添加SIDIR驱动&#xff0c;连接到1200PLC 在IDE中创建对象DT01并绑定到驱动上 可看到已经可以读取到值了 打开smsalarm 8.26 创建一个DDE连接 创建一个DDE逻辑组 创建一个tag. 名称可以填任意字符串&#xff0c;…

SpringBoot在使用测试的时候是否需要@RunWith?

我们在使用SpringBoot进行测试的时候一般是需要加两个注解&#xff1a; SpringBootTest 目的是加载ApplicationContext&#xff0c;启动spring容器。 RunWith 是一个测试启动器&#xff0c;可以加载SpringBoot测试注解让测试在Spring容器环境下执行。如测试类中无此注解&#…

ORACLE中的行列转换(行转列,列转行)

行转列&#xff1a; 源表&#xff1a; 方法1&#xff1a;case when select y, sum(case when q1 then amt end) q1, sum(case when q2 then amt end) q2, sum(case when q3 then amt end) q3, sum(case when q4 then amt end) q4 from test04 group by y; 效果&#xff1a; …

详解动态库静态库、动态链接静态链接

目录 静态库&&动态库 举例 注意 动态链接 静态链接 静态库&&动态库 静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为“.a” libXXXXXXX.a (windows下是.lib) 动态…

韩国网民钟爱的国内电商平台商品详情响应示例

一、中国电商业的发展&#xff0c;已经超过了欧美等过&#xff0c;大家都喜欢中国的商品&#xff0c;中国商品的特点个人总结有以下几点&#xff1a; 1、款式新颖多样 2、价格实惠 3、品种齐全 二、常用接口响应示例说明 公共参数 展开请求参数 三、返回响应示例 {"…

LeetCode 128. 最长连续序列

&#x1f308;&#x1f308;&#x1f604;&#x1f604; 欢迎来到茶色岛独家岛屿&#xff0c;本期将为大家揭晓LeetCode 128. 最长连续序列&#xff0c;做好准备了么&#xff0c;那么开始吧。 &#x1f332;&#x1f332;&#x1f434;&#x1f434; 一、题目名称 LeetCode…

反电信网络诈骗普法宣传答题实现联表查询学生的平均成绩

国际经济与贸易学院组织反电信网络诈骗线上答题活动&#xff0c;开展集中普法宣传教育活动&#xff0c;从而构筑立体化反诈骗防线。通过此次比赛&#xff0c;引导广大同学时刻牢记反诈骗内容&#xff0c;提高师生的自我财产安全防范意识&#xff0c;加强自我网络保护的思想理念…

Java中列表的基本操作

文章目录1、定义列表2、增删改操作&#xff08;1&#xff09;新增&#xff08;2&#xff09;删除&#xff08;3&#xff09;修改3、访问列表4、遍历列表&#xff08;1&#xff09;for循环遍历&#xff08;2&#xff09;foreach遍历&#xff08;3&#xff09;iterator迭代器遍历…

weblogic t3协议报错

目录 1、背景 2、报错信息 3、检测t3协议是否正常 1、背景 在上次生产环境版本升级的时候遇到问题&#xff0c;运维人员告知升级失败&#xff0c;然后首先怀疑是版本问题&#xff0c;就仔细检查了版本信息&#xff0c;没发现异常&#xff0c;然后与运维沟通获取到报错信息如…

如何利用 knest 构建数据中心的 Kubernetes as a Service?

随着越来越多的企业和应用转向云原生架构&#xff0c;对 Kubernetes 集群的需求也日趋多样化和灵活化。出于故障隔离的考虑&#xff0c;企业的数据中心往往需要多个独立的 Kubernetes 集群来承载不同的业务&#xff0c;而不是全部署在一个共享 Kubernetes 集群上。此外&#xf…

elastic search window安装,基础概念,项目实例

elastic searchelasticsearch场景window 安装教程基本配置成功标志基础知识名词概念介绍文档元数据索引创建原则创建实例创建索引指定 分区&#xff0c;片区的创建创建带有类型、映射的索引(Index)创建文档创建文档spring boot 整合项目实践全文检索高亮显示elasticsearch场景 …

CANoe的各模块节点是如何选择应用层通道的

当CANoe为Channel-based access模式时,需要配置软硬件通道的映射;当CANoe为Network-based access模式时,需要配置软硬件网络的映射 通道映射: 网络映射: 当然,只有CANoe软件工作模式为Real bus时,才需要软硬件通道或网络映射。如果工作模式为Simulated bus时,不需要软…

如何使用 Authing 实现 AWS CLI 单点登录?

越来越多企业和开发者依赖使用 Authing 单点登录 SSO 来便捷无缝的访问 AWS 服务。随着组织将更多业务上云&#xff0c;为员工提供无缝安全的访问认证&#xff0c;以此来提升员工的工作效率和保障企业的信息安全至关重要。 但随着业务的扩张&#xff0c;会发现在 AWS 环境中管…

pdf转换成word加密怎么办,这个方法能派上用场!

处理文档的时候难免遇到各种难题&#xff0c;就比如格式切换&#xff0c;PDF转word就是很常见的需求。有些工作性质比较特殊&#xff0c;对文档对保密性也有要求。这时候不仅要会把PDF转成word文档&#xff0c;还要学会给文档加密。有没有工具能把这两件事都办到呢?答案是有&a…

直播美颜SDK贴纸功能实现流程、贴纸代码分析

时下&#xff0c;直播美颜SDK已经成了大家日常拍摄以及专业美颜的必备工具。另外它也接入到了各种社交平台、短视频平台、直播平台中&#xff0c;此类平台中大部分用户都熟练掌握了美颜SDK的拍摄技巧&#xff0c;特别是短视频平台中&#xff0c;几乎每个用户都曾经使用过。根据…

极光笔记 | 如何为 iOS 16 创建一个实时活动

01、iOS 16 中的 Live Activity &#xff08;实时活动&#xff09;是什么&#xff1f;根据 Apple 官方描述&#xff0c;“实时活动是一项新功能&#xff0c;可帮助用户直接从锁定屏幕实时获知各种事情的进展&#xff0c;例如体育比赛、锻炼、拼车或送餐订单进度等等” 。例如&a…

Revit中基线的作用和【类型可见性】功能

一、Revit中基线的作用 Revit中基线是一个重要但又容易被忽视的内容&#xff0c;本文就简单介绍一下基线的一些常用功能&#xff0c;基线的作用&#xff1a; 1、参照底图 基线调整为其他层时&#xff0c;可以在当前视图中半色调显示&#xff0c;方便参照。 2、定位 3、基线还可…

【UE4 第一人称射击游戏】35-击中目标时添加准心提示

上一篇&#xff1a;【UE4 第一人称射击游戏】34-制作一个简易计时器本篇效果&#xff1a;可以看到击中目标后有了一个红色准心的提示效果步骤&#xff1a;新建一个控件蓝图&#xff0c;命名为“Hitmarker”双击打开“Hitmarker”&#xff0c;拖入一个图像控件&#xff0c;锚点设…