【Leetcode】字符串 string 补充知识

  • 有限状态机

请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。

函数 myAtoi(string s) 的算法如下:

  1. 读入字符串并丢弃无用的前导空格
  2. 检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。
  3. 读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
  4. 将前面步骤读入的这些数字转换为整数(即,"123" -> 123, "0032" -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。
  5. 如果整数数超过 32 位有符号整数范围 [−2^31,  2^31−1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −2^31 的整数应该被固定为 −2^31 ,大于 2^31−1 的整数应该被固定为 2^31−1 。
  6. 返回整数作为最终结果。

步骤:1.写出状态转移表格,定义初始状态

           2.获取当前状态

           3.根据当前状态查表更新下一状态

''+/-0-9other
startstartsignnumberend
signendendnumberend
numberendendnumberend
endendendendend
#力扣官方题解
INT_MAX = 2 ** 31 - 1
INT_MIN = -2 ** 31class Automaton:def __init__(self):self.state = 'start'self.sign = 1self.ans = 0self.table = {'start': ['start', 'signed', 'in_number', 'end'],'signed': ['end', 'end', 'in_number', 'end'],'in_number': ['end', 'end', 'in_number', 'end'],'end': ['end', 'end', 'end', 'end'],}def get_col(self, c):          #判断状态if c.isspace():return 0if c == '+' or c == '-':return 1if c.isdigit():return 2return 3def get(self, c):self.state = self.table[self.state][self.get_col(c)]  #更新状态if self.state == 'in_number':self.ans = self.ans * 10 + int(c)self.ans = min(self.ans, INT_MAX) if self.sign == 1 else min(self.ans, -INT_MIN)  #没考虑溢出elif self.state == 'signed':self.sign = 1 if c == '+' else -1class Solution:def myAtoi(self, str: str) -> int:automaton = Automaton()   for c in str:automaton.get(c)return automaton.sign * automaton.ans

优化点:如果写在同个类里可以当状态更新为“end”时结束循环

  • 正则表达式

请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。

函数 myAtoi(string s) 的算法如下:

  1. 读入字符串并丢弃无用的前导空格
  2. 检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。
  3. 读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
  4. 将前面步骤读入的这些数字转换为整数(即,"123" -> 123, "0032" -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。
  5. 如果整数数超过 32 位有符号整数范围 [−2^31,  2^31−1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −2^31 的整数应该被固定为 −2^31 ,大于 2^31−1 的整数应该被固定为 2^31−1 。
  6. 返回整数作为最终结果。

正则规则总结

        1.^:指定开头                                                   ^s 匹配以s开头的字符串

        2.$:指定结尾                                                   aaa$匹配以aaa结尾的字符串

           ^ $同时使用:精准匹配                                  ^saaa$只能匹配saaa

        3.转义序列需要添加\:                                      \.匹配带.的字符串

        4.字符簇[]:                                                       [a-zA-Z]匹配英文字符串

           ^[]同时使用:^表示“排除的意思”                     [^A-Z]匹配非大写字符串

        5..可以匹配任何字符(\n \r除外)                          ^.a$匹配任意长度为2且以a结尾的字符串

        6.{}限制出现次数:{m,n} 代表出现[m,n]次         a{3,}$匹配任意以3个及3个以上a结尾的字符串

           简化表达:?={0,1}      *={0,}       +={1.}

        7.\d,\w,\s - 匹配数字、字符、空格。

           \D,\W,\S - 匹配非数字、非字符、非空格

题目需要的匹配规则:^[\+\-0-9]?\d*    ^[\+\-]?\d+ 

import re
class Solution:def myAtoi(self, str: str) -> int:INT_MIN = -2147483648INT_MAX = 2147483647    str = str.lstrip()                     #清除左边多余的空格num_rule = re.compile(r'^[\+\-]?\d+')  #设置正则规则num = num_rule.findall(str)             #查找匹配的内容#num = ['-123']num = int(*num)                        #解包并且转换成整数return max(min(num,INT_MAX),INT_MIN)              
  • Manacher 

Manacher算法:线性复杂度  O(2*len+3)——竞赛难度...别为难我了(哭

(44 封私信 / 80 条消息) 有什么浅显易懂的Manacher Algorithm讲解? - 知乎 (zhihu.com)

def manacher(s):T = '#'.join('^{}$'.format(s))   #原奇数长度的字符串插入偶数个字符长度仍为奇,原偶数长度的字符串插入奇数个字符长度变为奇,这样能保证子串长度只为奇;#由于边界符号不同,到边界时自动结束循环,减少了对越界条件的判断;      P = [0] * len(T)R, C = 0,                       #使用中心下标C和尾部下标Rfor i in range(1,len(T) - 1):   #以每个字符作为对称中心if i < R:P[i] = min(P[2 * C - i], R - i)while T[i+(P[i]+1)] == T[i-(P[i]+1)]:P[i] += 1if i + P[i] > R:R, C = i + P[i], ireturn P
  • 动态规划

给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。

动态规划三步骤:穷举分析—确定边界—确定最优子结构(找规律)

状态定义:dp[i, j]表示以第i位开头以第j位结尾的字符串是否是回文串

边界:i—[0, len(s)-1]  j—[i,len(s)]

根据回文串性质可知:由 dp[i, j]== True 加上 s[i-1]==s[j+1] 可以推导出 dp[i-1,j+1]==True

最优子结构:dp[i, j] = s[i]==s[j] + dp[i+1,j-1]==True      所以对i遍历时需要倒序,对j遍历则需要正序;

                     但推导公式是向两边同时扩展得到,不适用于字符串初始长度为1/2的情况;

                     完整规律:i=j时,回文串成立;i=j-1时,回文串成立;其余情况,递推;

class Solution:def countSubstrings(self, s: str) -> int:dp = [[False] * len(s) for _ in range(len(s))]result = 0for i in range(len(s)-1, -1, -1): #i倒序遍历for j in range(i, len(s)):    #j正序遍历if s[i] == s[j]:if j - i <= 1:        #情况一和情况二result += 1dp[i][j] = Trueelif dp[i+1][j-1]:    #情况三result += 1dp[i][j] = Truereturn result

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

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

相关文章

windows 两个服务器远程文件夹同步,支持文件新增文件同步、修改文件同步、删除文件同步,根据文件大小和时间戳判断文件是否修改 python脚本

在Python中实现Windows两个服务器之间的文件夹同步&#xff0c;包括文件新增、修改和删除的同步&#xff0c;可以使用paramiko库进行SSH连接以及SFTP传输&#xff0c;并结合文件大小和时间戳判断文件是否发生过变化。以下是包含删除文件同步逻辑的完整脚本示例&#xff1a; im…

二十五、剖析HashMap

剖析HashMap 本文为书籍《Java编程的逻辑》1和《剑指Java&#xff1a;核心原理与应用实践》2阅读笔记 1.1 Map 接口 Map是映射&#xff0c;有键和值的概念&#xff0c;映射表示键和值之间的对应关系&#xff0c;一个键映射到一个值&#xff0c;Map按照键存储和访问值&#x…

leetcode 3.5

普通数组 1.最大子数组和 最大子数组和 前缀和pre 动态规划 pre保留的是当前包含了当前遍历的最大的前缀和&#xff0c;如果之前的pre 对结果有增益效果&#xff0c;则 pre 保留并加上当前遍历, 如果pre 对结果无增益效果&#xff0c;需要舍弃&#xff0c;则 pre 直接更新为…

贝叶斯树定义与构建的寻行数墨

Title: 贝叶斯树定义与构建的寻行数墨 —— Notes for “The Bayes Tree: An Algorithmic Foundation for Probabilistic Robot Mapping” 文章目录 I. 前言II. 贝叶斯树的定义1. 贝叶斯树的背景2. 贝叶斯树的特点3. 贝叶斯树的定义 III. 贝叶斯树的构建1. 贝叶斯树的构建算法2…

CTP-API开发系列之接口对接准备

CTP-API开发系列之接口对接准备 CTP-API开发系列之接口对接准备CTP-API文件清单CTP-API通用规则命名规则Spi与Api CTP-API通讯模式开发语言选择 CTP-API开发系列之接口对接准备 CTP-API文件清单 文件名说明ThostFtdcTraderApi.h交易接口&#xff0c;C头文件&#xff0c;包括 …

紧跟潮流,再整一个短剧搜索网站

前面一大批的转存量太大了&#xff0c;有些小伙伴用不上&#xff0c;所以整了个搜索网站&#xff0c;输入关键词搜索即可。 搜短剧 http://wjsyyx.top/sdj/ 界面依旧主打朴实无华&#xff0c;搜索一步到位。 ▼ 网站界面 ▼ 搜索结果 剩下的就都会了。 ▼ 往期推荐 【Python】…

Ubuntu 安装谷歌拼音输入法

一、Fcitx 安装 在Ubuntu 下&#xff0c;谷歌拼音输入法是基于Fcitx输入法的。所以&#xff0c;首先需要安装Fcitx。一般来说&#xff0c;Ubuntu最新版中都默认安装了Fcitx&#xff0c;但是为了确保一下&#xff0c;我们可以在系统终端中运行如下命令&#xff1a; sudo apt ins…

Linux 学习笔记(7)

七、 时间管理 1 、 Linux 时间介绍&#xff1a; Linux 时钟分为系统时钟&#xff08; System Clock &#xff09;和硬件&#xff08; Real Time Clock &#xff0c;简称 RTC &#xff09;时钟。系统时钟 是指当前 Linux Kernel 中的时钟&#xff0c;而硬件时钟则是主板…

【WPS】Excel查重数据对比

数据对比 数据对比标记重复数据查询过滤处理

使用pyannote-audio实现声纹分割聚类

使用pyannote-audio实现声纹分割聚类 # GitHub地址 https://github.com/MasonYyp/audio1 简单介绍 pyannote.audio是用Python编写的用于声纹分割聚类的开源工具包。在PyTorch机器学习基础上&#xff0c;不仅可以借助性能优越的预训练模型和管道实现声纹分割聚类&#xff0c;还…

2742: 【数据结构】【栈】字符串匹配问题

题目描述 字符串中只含有括号 (),[],<>,{},判断输入的字符串中括号是否匹配。如果括号有互相包含的形式&#xff0c;从内到外必须是<>,(),[],{}&#xff0c;例如。输入: [()] 输出:YES&#xff0c;而输入([])&#xff0c; ([])都应该输出NO。 输入 文件的第一行…

你知道katalon studio 如何完成 get/post 请求发送吗?

katalon studio作为目前最火的自动化测试工具之一&#xff0c;不仅仅只能完成webUI自动化&#xff0c;更是能完成api、app以及桌面应用程序的自动化测试。 本文将讲解一下katalon studio是如果完成接口测试的。 请求发送 get请求 1、先在object repository里new一个请求 2、…

什么是网关

网关(Gateway)&#xff1a;又称网间连接器、协议转换器。网关在网络层以上实现网络互连&#xff0c;是复杂的网络互连设备&#xff0c;仅用于两个高层协议不同的网络互连。网关既可以用于广域网互连&#xff0c;也可以用于局域网互连。 网关是一种充当转换重任的计算机系统或设…

惯性导航 | 航迹推算与gazebo仿真

惯性导航 | 航迹推算与gazebo仿真 IMU数据进行短时间航迹推算代码gazebo中进行仿真测试 IMU数据进行短时间航迹推算 代码 声明一个用与 IMU积分的类 &#xff0c;来实现 短时间内的航迹推算 类的名字叫 IMUIntegration 构造函数 有三个变量进行私有变量初始化 重力、初始陀螺…

怎样从一个新手,实现windows搭建wvp+zlm流媒体平台?

转载&#xff1a;wvpzlmediakit实现国标28181对讲_wvp gb28181-CSDN博客

Python调用edge-tts实现在线文字转语音

edge-tts是一个 Python 模块&#xff0c;允许通过Python代码或命令的方式使用 Microsoft Edge 的在线文本转语音服务。 项目源码 GitHub - rany2/edge-tts: Use Microsoft Edges online text-to-speech service from Python WITHOUT needing Microsoft Edge or Windows or an…

Docker_设置docker服务以及容器开机自启

本文目录 docker服务开机自启动查询docker服务开机自启动状态将docker服务设置为开机自启动取消docker服务开机自启动 容器开机自启动修改docker容器为自启动容器启动时设置自启动-docker版容器启动时设置自启动-docker-compose版 docker服务开机自启动 查询docker服务开机自启…

Linux判断系统是否为64位命令

在Linux系统中&#xff0c;有几种方法可以帮助你判断你的系统是32位还是64位。以下是一些常用的方法&#xff1a; 1. 使用uname命令 打开终端&#xff0c;输入以下命令&#xff1a; uname -m输出结果可能是&#xff1a; x86_64&#xff1a;表示你的系统是64位。i686、i386&…

Vue 中组件通讯的方式

Vue 中组件通讯的方式有多种&#xff0c;可以根据不同的场景选择合适的方式进行通讯。以下是一些常见的组件通讯方式及其适用场景的总结&#xff1a; Props 和 Events&#xff1a; 场景&#xff1a;父组件向子组件传递数据或子组件向父组件触发事件。适用&#xff1a;单向数据流…

33岁大马女星赴港打拼十年终夺「最佳女配」。

近两年有多位「大马女神」在香港走红&#xff0c;最火的莫过于甜美可人、样靓身材正的林明祯&#xff0c;不仅在电影圈有好成绩&#xff0c;还成了广告界的宠儿。 不过说到演技最精湛的「大马女神」&#xff0c;就不得不提近年在香港电影圈炙手可热的廖子妤&#xff0c;前年她凭…