Leetcode 4.18

Leetcode

  • 1.无重复字符的最长子串
  • 2.最长回文子串
  • 3.整数反转
  • 4.字符串转换整数 (atoi)
  • 5.正则表达式匹配

1.无重复字符的最长子串

无重复字符的最长子串
滑动窗口,先让右指针右移,如果发现这个子串有元素和右指针当前元素重复。
则:

  1. 左指针右移,直到移除重复元素为止。
  2. 怎么计算是否有重复?用unordered_map维护子串个数,删除的话数量响应减少,如果count == 0 则将元素erase
  3. 随时更新ans长度,用mp.size()可以轻松算出长度
class Solution {
public:int lengthOfLongestSubstring(string s) {int ans = 0;if (s.size() <= 1) return s.size();int l = 0, r = 0;unordered_map<char, int> mp;while (l <= r && r < s.size()) {//当有重复元素时,移动左指针,直到删除了左侧重复元素while (mp.count(s[r]) != 0) {//重复元素左侧元素都得依次删除mp[s[l]]--;if (mp[s[l]] == 0) mp.erase(s[l]);l++;}//添加右侧元素,此时已经不重复了mp[s[r]]++;ans = max(ans, (int)mp.size());  r++;}return ans;}
};

2.最长回文子串

最长回文子串
两个要点:

  1. 判断是否为回文串 —> 分奇偶数,l,r指针分别指向头尾,观察r–,l++是否相等
  2. 是否为最长—> 可以用ans维护最长的个数

暴力解法:可以双重循环,依次判断是否为回文串。

class Solution {
public:string longestPalindrome(string s) {int n = s.size();string ans = s.substr(0, 1);if (n <= 1) return s;for (int i = 0; i < n; i++) {for (int j = i; j < n; j++) {if (j - i + 1 > ans.size() && ispalindorme(s, i ,j)) {ans = s.substr(i, j - i + 1);}}}return ans;}bool ispalindorme(string s, int l, int r) {while (r >= l) {if (s[l] != s[r]) {return false;}l++, r--;}return true;}
};

中心扩散法:
给定一个字符串,从中间到两边扩散,判断从左到右范围内最长的回文子串长度。
考虑到奇偶数的不同情况,需要调用两次中心扩散函数。

class Solution {
public:string res;string longestPalindrome(string s) {int n = s.size();if (n <= 1) return s;for (int i = 0; i < n; i++) {extandformmid(s, i, i);extandformmid(s, i, i+1);}return res;}void extandformmid(string& str, int left, int right) {while (left >= 0 && right < str.size() && str[left] == str[right]) {left--;right++;}if (right - left - 1 > res.size()) {res = str.substr(left + 1, right - left - 1);}}
};

3.整数反转

整数反转
用ans保存反转后的答案。
在处理数字的过程中判断ans是否有溢出情况发生。
在这里插入图片描述
在这里插入图片描述

class Solution {
public:int reverse(int x) {int ans = 0;while (x) {if (ans < INT_MIN / 10 || ans > INT_MAX / 10) {return 0;}ans = ans * 10 + (x % 10);x= x / 10;}return ans;}
};

4.字符串转换整数 (atoi)

字符串转换整数 (atoi)
去除前导空格—> while删除
检查正负号—> 有则按照符号,无则为正
读入字符—> ans = ans * 10 + digt
整数范围—>如果下一次ans * 10会溢出,则直接返回这次的结果

class Solution {
public:int myAtoi(string s) {int ans = 0; int flag = 1;int index = 0, n = s.size();//删除空格while (index < n && s[index] == ' ') index++;//检查符号if (index < n) {if (s[index] == '-') {flag = -1;index++;} else if (s[index] == '+'){flag = 1;index++;}}//读入字符while (index < n && isdigit(s[index])) {int dig = s[index] - '0';//注意这里严格按照推理所得的公式计算if (ans > (INT_MAX - dig) / 10) {return flag == 1 ? INT_MAX : INT_MIN;}ans = ans * 10 + dig;index++;}return ans * flag;}
};

5.正则表达式匹配

正则表达式匹配
子串匹配的题目,不由自主的先想DP。

DP分两步:
定义状态
定义状态转移方程

  • 状态
    dp[i][j]表示s[…i]与p[…j]是否能够匹配。dp[s.size()-1][p.size()-1]即为本题答案。

  • 状态转移

    • p[j - 1] = '*' 时, dp[i][j] 在当以下任一情况为 true 时等于 true:

      • dp[i][j - 2]: 即将字符组合 p[j - 2] * 看作出现 0 次时,能否匹配。
      • dp[i - 1][j]s[i - 1] = p[j - 2]: 即让字符 p[j - 2] 多出现 1 次时,能否匹配。
      • dp[i - 1][j]p[j - 2] = '.': 即让字符 '.' 多出现 1 次时,能否匹配。
    • p[j - 1] != '*' 时, dp[i][j] 在当以下任一情况为 true 时等于 true

      • dp[i - 1][j - 1]s[i - 1] = p[j - 1]: 即让字符 p[j - 1] 多出现一次时,能否匹配。
      • dp[i - 1][j - 1]p[j - 1] = '.': 即将字符 . 看作字符 s[i - 1] 时,能否匹配。

p[j-1] == '*'的情况下
1. dp[i][j-2] == True # * 匹配0次,然后s不变,让p[(j-1)-1]匹配0次,相当于消除了一个字符,这里之所以用 [j-2] 是因为相当于 *号和它前面的个字符被丢掉了
2. p[j-2] == s[i-1] and dp[i-1][j] == True # * 匹配多次,这里的多次是可以让前面的1次累加起来的,所以相当于让 * 匹配1次,这里之所以是dp[i-1][j]是因为匹配了一次s中的最后一个字符,所以可以相当于丢掉s中的字符,但是p中的 *和它前面的字符并没有被消耗掉,因为*号可以匹配任意次
3. p[j-2] == '.' and dp[i-1][j] == True # 这里要注意 这里表示*号前面是个'.''.'可以匹配任意字符,所以'.*'可以表示成 … 是上面2中的 p[j-2] == s[i-1] 一种特例
在这里插入图片描述
在这里插入图片描述

class Solution {
public:bool isMatch(string s, string p) {int n = s.size() + 1, m = p.size() + 1;vector<vector<bool>> dp(n, vector<bool> (m, false));int i = 1, j = 1;//空字符串可以匹配dp[0][0] = true;// 初始化首行for(int j = 2; j < m; j += 2)dp[0][j] = dp[0][j - 2] && p[j - 1] == '*';for(int i = 1; i < n; i++) {for (int j = 1; j < m; j++) {if (p[j - 1] == '*') {if (dp[i - 1][j] && s[i - 1] == p[j - 2]) {dp[i][j] = true;//上上个元素为. , 让.多出现几次} else if (dp[i - 1][j] && p[j - 2] == '.') {dp[i][j] = true;//j - 2,指上一个元素为0} else if (dp[i][j - 2]) {dp[i][j] = true;}} else {//匹配上了if (dp[i - 1][j - 1] && s[i - 1] == p[j - 1]) {dp[i][j] = true;//是'.'} else if (dp[i - 1][j - 1] && p[j - 1] == '.') {dp[i][j] = true;}}}}//return dp[n - 1][m - 1];}
};

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

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

相关文章

【嵌入式之中断】

Cortex-M4集成了嵌套式矢量型中断控制器(Nested Vectored Interrupt Controller (NVIC))来实现高效的异常和中断处理。NVIC实现了低延迟的异常和中断处理&#xff0c;以及电源管理控制。它和内核是紧密耦合的。 凡是打断程序顺序执行的事件都称为异常&#xff08;exception&am…

极狐GitLab x LigaAI,AI 时代研发提效新范式

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 近日&#xff0c;极狐GitLab 和 LigaAI 宣布合作&#xff0c;双…

CentOS 7安装Zookeeper

说明&#xff1a;本文介绍如何在CentOS 7操作系统下使用Zookeeper 下载安装 首先&#xff0c;去官网下载所需要安装的版本&#xff0c;我这里下载3.4.9版本&#xff1b; 上传到云服务器上&#xff0c;解压 tar -xvf zookeeper-3.4.9.tar.gz修改配置 进入Zookeeper目录下的co…

【技术变现之道】如何打造IT行业的超级个体?

前言 在当今的数字化时代&#xff0c;IT行业蓬勃发展&#xff0c;为具备技术专长的个人提供了无限的可能性。想要成为IT行业的超级个体&#xff0c;实现知识与技能的变现吗&#xff1f;以下是一些高效途径&#xff0c;助你一臂之力&#xff01; 1. 独立接单外包 1&#xff09…

vue3数字滚动组件

效果图 一、安装插件 npm i vue3-count-to 二、components文件夹下新建BaseCountTo.vue文件 <template><BaseCountTo :endVal"endVal" :decimals"decimals" /> </template> <script setup > import { defineComponent, watch, r…

改手机IP地址的软件推荐

随着移动互联网的普及&#xff0c;手机已成为人们日常生活中不可或缺的一部分。而在使用手机的过程中&#xff0c;IP地址作为一个重要的网络标识&#xff0c;有时也需要进行修改或更改。为了满足这一需求&#xff0c;市面上涌现出了许多改手机IP地址的软件。虎观代理将对这些软…

韩顺平Java | C27 正则表达式

入门介绍 需求&#xff1a;提取文本中某类字符 传统方法&#xff1a;遍历每个字符&#xff0c;判断其是否在ASCII码中某种类型得编码范围内&#xff0c;代码量大&#xff0c;效率不高 正则表达式(RegExp, regular expression)&#xff1a;处理文本的利器&#xff0c;是对字符…

java混淆的公司有哪些

一些提供 Java 混淆服务的公司包括&#xff1a; PreEmptive Solutions&#xff1a;PreEmptive Solutions 提供了一系列用于保护 Java 和 .NET 应用程序的工具&#xff0c;包括混淆、代码压缩、加密和漏洞检测等功能。 DexGuard&#xff1a;DexGuard 是 Guardsquare 公司推出的…

【JavaWeb】异步请求——AJAX

目录 Ajax&#xff08;Asynchronous JavaScript and XML&#xff09;优点传统Web与Ajax的差异Ajax工作流程Ajax 经典应用场景XMLHttpRequest常用方法事件常用属性 ajax: GET请求和POST请求的区别 传统Ajax实现传统方式实现Ajax的不足 $.ajax()语法常用属性参数常用函数参数 Aja…

golang 迷宫回溯算法(递归)

// Author sunwenbo // 2024/4/14 20:13 package mainimport "fmt"// 编程一个函数&#xff0c;完成老鼠找出路 // myMap *[8][7]int 地图&#xff0c;保证是同一个地图&#xff0c;因此是引用类型 // i,j表示对地图的哪个点进行测试 func SetWay(myMap *[8][7]int, …

网络基础-基于TCP协议的Socket通讯

一、Socket通讯基于TCP协议流程图 UDP 的 Socket 编程相对简单些不在介绍。 二、 服务端程序启动 服务端程序要先跑起来&#xff0c;然后等待客户端的连接和数据。 服务端程序首先调用 socket() 函数&#xff0c;创建网络协议为 IPv4&#xff0c;以及传输协议为 TCP 的…

基于XML配置bean(二)

文章目录 1.工厂中获取bean1.静态工厂1.MyStaticFactory.java2.beans.xml3.测试 2.实例工厂1.MyInstanceFactory.java2.beans.xml3.测试 3.FactoryBean&#xff08;重点&#xff09;1.MyFactoryBean.java2.beans.xml3.测试 2.bean配置信息重用继承抽象bean1.beans.xml2.测试 3.…

HarmonyOS实战开发-如何实现一个简单的健康生活应用

功能概述 成就页面展示用户可以获取的所有勋章&#xff0c;当用户满足一定的条件时&#xff0c;将点亮本页面对应的勋章&#xff0c;没有得到的成就勋章处于熄灭状态。共有六种勋章&#xff0c;当用户连续完成任务打卡3天、7天、30天、50天、73天、99天时&#xff0c;可以获得…

SpringBoot框架——8.MybatisPlus常见用法(常用注解+内置方法+分页查询)

1.MybatisPlus常用注解&#xff1a; 1.1 当数据库、表名和字段名和实体类完全一致时无需加注解&#xff0c;不一致时&#xff1a; TableName指定库名 TableId指定表名 TableField指定字段名 1.2 自增主键&#xff1a; TableId(typeIdType.AUTO) private Long id; 1.3 实体类中属…

2000-2022年各省人力资本水平数据(含原始数据+计算过程+计算结果)(无缺失)

2000-2022年各省人力资本水平数据&#xff08;含原始数据计算过程计算结果&#xff09; 1、时间&#xff1a;2000-2022年 2、来源&#xff1a;国家统计局 3、指标&#xff1a;普通高等学校在校学生数(万人)、年末常住人口&#xff08;万人&#xff09;、人力资本水平 4、范…

CTFshow-PWN-前置基础(pwn20)

提交ctfshow{【.got表与.got.plt是否可写(可写为1&#xff0c;不可写为0)】,【.got的地址】,【.got.plt的地址】 前置基础知识&#xff1a; .got 和 .got.plt 是 ELF&#xff08;Executable and Linkable Format&#xff0c;可执行和可链接格式&#xff09;二进制文件中的两个…

(四)qt中使用ffmpeg播放视频,可暂停恢复

一、在qt中添加ffmpeg库及头文件 INCLUDEPATH /usr/local/ffmpeg/include LIBS -L/usr/local/lib -lavutil -lavcodec -lavformat -lswscale 二、详细代码 FFempegVideoDecode 视频解码类&#xff08;放入线程中&#xff09; ffmpegvideodecode.h #ifndef FFMPEGVIDEODE…

RHCE作业二

一.配置server主机要求如下&#xff1a; 1.server主机的主机名称为 ntp_server.example.com 2.server主机的IP为&#xff1a; 172.25.254.100 3.server主机的时间为1984-11-11 11&#xff1a;11&#xff1a;11 4.配置server主机的时间同步服务要求可以被所有人使用 二.设定cli…

Http 请求偶发400错误

1. 背景 生产环境偶发400请求错误&#xff0c;发生概率万分之一&#xff0c;异常信息如下&#xff1a; 1&#xff09; 从异常信息可以看到&#xff0c;skywalking的sw8 header解析失效导致异常信息。 2&#xff09; 0x0d0x0a 作为回车换行符号&#xff0c;没有被正确处理&#…

OpenGL:图元

OpenGL的图元 点 GL_POINTS: 将顶点绘制成单个的点 线 GL_LINES:将顶点用于创建线段,2个点成为一条单独的线段。如果顶点个数是奇数,则忽略最后一个。 顶点:v0, v1, v2, v3, … , vn,线段:v0-v1, v2-v3, v4-v5, … , vn-1 - vn GL_LINE_STRIP:将顶点用于创建线段,…