算法_字符串专题---持续更新
文章目录
- 前言
- 最长公共前缀
- 题目要求
- 题目解析
- 代码如下
- 最长回文子串
- 题目要求
- 题目解析
- 代码如下
- 二进制求和
- 题目要求
- 题目解析
- 字符串相乘
- 题目要求
- 题目解析
- 代码如下
前言
本文将会向你介绍有关字符串的相关题目:最长公共前缀、最长回文子串、二进制求和、字符串相乘。本篇并不是介绍字符串相关的算法,只是将题目要求为字符串类型的归类
最长公共前缀
https://leetcode.cn/problems/longest-common-prefix/description/
题目要求
题目解析
题目要求找到最长公共前缀,我们很简单地就能想到将字符串中的字符一一比较,返回最长公共前缀,这里采用的是字符串两两比较,先拿第一个字符串与第二个字符串比较,再拿它们的最长公共前缀与第三个字符串比较,最后就能得到最长公共前缀代码如下
string findCommon(string& s1, string& s2)
{int i = 0;//注意条件,比较两个字符串,最短的字符串结束就结束了while(i < min(s1.size(), s2.size()) && s1[i] == s2[i]) {i++;}return s1.substr(0, i);
}
class Solution {
public:string longestCommonPrefix(vector<string>& strs){string ret = strs[0];for(int i = 1; i < strs.size(); i++){ret = findCommon(ret, strs[i]);}return ret;}
};
最长回文子串
https://leetcode.cn/problems/longest-palindromic-substring/
题目要求
题目解析
给一个字符串,要求出字符串中最长的回文子串,即需要在一个字符串中找到中间对称的子串,aba,bab都是关于中间对称,那么我们可以对所有的可能为中点的点遍历一遍,这样才能找出最长的,这里采用中心扩展算法,即遍历每个点(每次把该点当作中点),从该点开始向左向右进行移动,如果left[i] = right[i],则继续向左向右移动,直到不相同位置,那么就可以找到以某个点为中心对称的字符串当出现类似回文子串b a b这种格式,是需要将left = right = i(i:遍历的每个点),即子串字符数为奇数情况 当出现类似回文串b b这种格式,是需要将left = i,right = i + 1 即子串字符数为偶数情况注意点:分奇偶
代码如下
class Solution {
public:string longestPalindrome(string s) {int n = s.size();int len = 0; //最长回文串长度int begin = 0; //回文串的起始位置//遍历所有可能为中点的点for(int i = 0; i < n; i++){//字符串为奇数个字符int left = i, right = i;while(left >= 0 && right <= n && s[left] == s[right]){left--;right++;}if(right - left - 1 > len){len = right - left - 1;begin = left + 1;}//字符串为偶数个字符left = i, right = i + 1;while(left >= 0 && right <= n && s[left] == s[right]){left--;right++;}if(right - left - 1 > len){len = right - left - 1;begin = left + 1;}}return s.substr(begin, len);}
};
二进制求和
https://leetcode.cn/problems/add-binary/
题目要求
题目解析
给两个字符串,按照二进制加法相加,我们很自然地能想到遍历每个字符,然后按照二进制相加,模拟加法过程即可
在正常加法中,我们都是从低位,即图中下标为3的位置相加直到加到高位,其中还包含低位向高位的进位,因此模拟过程中也需要把进位给模拟出来,因此我们必须也要从下标为3的位置字符开始相加 也可以看看另一道类似解法的题注意点一:字符串模拟加法
两数相加,这在篇文章链表专题中也提到过
当其中一个字符串结束,都不能作为结束条件,而且当两个字符串都遍历完了,可能进位不为0,也不能结束 ## 代码如下注意点二:结束条件
class Solution {
public:string addBinary(string a, string b) {int t = 0; //进位string ret;int cur1 = a.size() - 1;int cur2 = b.size() - 1;while(cur1 >= 0 || cur2 >= 0 || t > 0){if(cur1 >= 0){t += a[cur1] - '0';cur1--;}if(cur2 >= 0){t += b[cur2] - '0';cur2--;}ret += t % 2 + '0';t/=2;}reverse(ret.begin(), ret.end());return ret;}
};
字符串相乘
https://leetcode.cn/problems/multiply-strings/
题目要求
题目解析
这道题容易想到的解法就是以其中一个字符串每一位去乘以另一个字符串,然后将每次相乘的结果再相加,如下图所示
但这种解法并不好写,因此将会介绍另一种不好想到,但是好写的解法
解法二
无进位相乘再相加,再处理进位
由于给定字符串下标的顺序与我们实际乘法+进位的顺序相反,所以我们先将给定字符串逆序一下,注意以后碰到带有进位类似的题目,最好也是先逆序一下
直接将两个字符串中的字符 - '0'相乘再相加即可,注意符号+=一、模拟乘法相加
for (int i = 0; i < sz1; i++){for (int j = 0; j < sz2; j++){tmp[i + j] += ((num1[i] - '0') * (num2[j] - '0'));}}
先用t保存相乘再相加的结果,将个位上的数留下,十位上的数进位二、模拟进位操作
//进位操作string ret;int t = 0, cur = 0; //进位while(cur < sz1 + sz2 - 1 || t != 0){if(cur < sz1 + sz2 - 1) t += tmp[cur++];ret += t % 10 + '0';t /= 10;}
如果123 乘 0 按照我们以上的模拟乘法,将会得出000,因此需要把前两个0给去掉三、去掉前导0
while(ret.size() > 1 && ret.back() == '0') ret.pop_back();
注意:当进位不为0的时候也不能结束循环,因为可能存在两个字符串最后一位为:3 + 7,进位为 1
最后逆序保存结果的字符串即可
代码如下
class Solution {
public:string multiply(string num1, string num2){reverse(num1.begin(), num1.end());reverse(num2.begin(), num2.end());int sz1 = num1.size();int sz2 = num2.size();vector<int> tmp(sz1 + sz2 - 1); //无进位相乘再相加后的数组for (int i = 0; i < sz1; i++){for (int j = 0; j < sz2; j++){tmp[i + j] += ((num1[i] - '0') * (num2[j] - '0'));}}//进位操作string ret;int t = 0, cur = 0; //进位while(cur < sz1 + sz2 - 1 || t != 0){if(cur < sz1 + sz2 - 1) t += tmp[cur++];ret += t % 10 + '0';t /= 10;}//去掉前导零while(ret.size() > 1 && ret.back() == '0') ret.pop_back();reverse(ret.begin(), ret.end());return ret;}
};
相关文章:

算法_字符串专题---持续更新
文章目录 前言最长公共前缀题目要求题目解析代码如下 最长回文子串题目要求题目解析代码如下 二进制求和题目要求题目解析 字符串相乘题目要求题目解析代码如下 前言 本文将会向你介绍有关字符串的相关题目:最长公共前缀、最长回文子串、二进制求和、字符串相乘。本…...

Anaconda与conda、pip与conda的区别
Anaconda与conda、pip与conda的区别 1. 引言1.1 背景介绍1.2 文章目的 2. 什么是Anaconda?2.1 Anaconda简介2.2 Anaconda的优势2.3 Anaconda的安装与配置 3. 什么是Conda?3.1 Conda简介3.2 Conda的功能和用途3.3 Conda与Anaconda的关系 4. 什么是Pip&…...

odoo Request Entity Too Large
在数据库恢复中,文件有256M大小,无法正常恢复下。显示如下: 解决办法: 修改http.py文件里面的 DEFAULT_MAX_CONTENT_LENGTH参数, odoo\http.py DEFAULT_MAX_CONTENT_LENGTH 128 * 1024 * 1024 # 128MiB 修改为300M,即…...

【C++ 面试 - 面向对象】每日 3 题(六)
✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/fYaBd 📚专栏简介:在这个专栏中,我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏&…...
基于tcp c/s的网络通信
TCP(即传输控制协议):是一种面向连接的传输层协议,它能提供高可靠性通信(即数 据无误、数据无丢失、数据无失序、数据无重复到达的通信) tcp协议特点: 1. 面向连接 //类似打电话通话之前 ,必须先打通 2. 可靠传输 …...

论文翻译:Universal and Transferable Adversarial Attacks on Aligned Language Models
Universal and Transferable Adversarial Attacks on Aligned Language Models https://arxiv.org/pdf/2307.15043v2 通用且可转移的对抗性攻击对齐语言模型 文章目录 通用且可转移的对抗性攻击对齐语言模型摘要1 引言2 一个针对LLMs的通用攻击2.1 产生肯定回应2.2 贪婪坐标梯…...

Axure RP 9高手速成秘籍:解锁终极快捷键,设计效率飙升10倍!
Axure RP 9作为一款功能强大的原型设计工具,提供了丰富的快捷键来加速设计流程。以下是一份详尽的Axure RP 9快捷键大全,旨在帮助用户更高效地完成设计工作。 一、文件操作 新建:Ctrl N(Windows)/ Command N&#…...

Springcloud从零开始--Eureka(一)
Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有…...

[数据集][目标检测]agvs仓储机器人检测数据集VOC+YOLO格式967张3类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):967 标注数量(xml文件个数):967 标注数量(txt文件个数):967 标注类别…...
(八)Flink Join 连接
在分布式数据处理中,JOIN 是一个非常重要的操作。Flink 的 JOIN 是用于将两个数据流按照一定的条件进行连接,生成新的数据流。Flink 双流 JOIN 主要分为两大类:一类是基于窗口的 JOIN 操作,另一类是基于原生 State 的 Connect 算子操作。其中基于窗口的 JOIN 可细分为 Wind…...

你也想转行成为一名程序员吗?作为过来人的我希望你想清楚这几个问题再做决定
1 有个朋友突然找我:“现在的工作不想干了,我现在转行搞IT能不能行?学哪个编程语言比较有前景?现在去搞网络安全应该没问题吧?”我相信,很多人出于各种原因都在考虑要不要进行职业转换,迷茫又焦…...

Linux文件属性和打包压缩详解
1、文件属性体系 1.1 文件系统概述 [rootyunwei /]# ls -lhi 总用量 72K3505 lrwxrwxrwx. 1 root root 7 3月 7 2019 bin -> usr/bin 262152 dr-xr-xr-x. 5 root root 4.0K 12月 19 16:00 boot 399635 drwxr-xr-x 2 root root 4.0K 11月 5 2019 data1026 drw…...
微服务注册到nacos时,注册失败报错解决
微服务注册到nacos时,注册失败报错解决 微服务注册nacos时报错nacos报错alipay-jraft.log日志报错原因排查 微服务注册nacos时报错 NacosException: failed to req API:/nacos/v1/ns/instance/list after all servers([127.0.0.1:28100]) tried: ErrCode:503, ErrM…...

基于Sringboot+Vue个人驾校预约管理系统--论文pf
TOC springboot503基于SringbootVue个人驾校预约管理系统--论文pf 第1章 绪论 1.1选题动因 当前的网络技术,软件技术等都具备成熟的理论基础,市场上也出现各种技术开发的软件,这些软件都被用于各个领域,包括生活和工作的领域。…...

python-逆序数(赛氪OJ)
[题目描述] 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。比如一个元素个数为 4 的数列,其元素为 2,4,3,1,则 (2,…...

PCIE-flit mode retry
下一个即将发送的seq num: 下一个即将发送的ack或者nak的seq num: Tx发送exp seq num的个数: Tx发送nak的个数 下一个期望收到的flit的seq num,注意是指下个期望收到的有效的、non-idle、non_duplictae的flit: 收到的flit的真实的seq num(implicit…...

使用Obsidian实现Anki快速制卡
文章目录 前言准备双双启用遇到问题查看是什么问题解决问题 开始使用使用前的一些设置快速制卡 前言 我现在使用 Anki 的同时也使用 Obsidian,正好可以通过插件来让这两个十分好用的软件实现联动。 在 Obsidian 中实现 Anki 的快速制卡。 准备 首先要在这两个软…...

Python编程:从入门到实践书籍介绍
对于Python入门的书籍推荐,以下是五本详细讲解的书籍,它们各自具有不同的特点和适用对象: 1. 《Python编程:从入门到实践》 作者:埃里克马瑟斯(Eric Matthes)《Python编程:从入门到实践》是一本经典的Pyth…...

Vue 3 的 emit 简单使用
在 Vue 3 中使用 emit,子组件可以将事件通知父组件,父组件可以在响应这些事件时执行特定的逻辑。 emit 是一种非常灵活的通信方式,允许组件之间以解耦的方式进行交互。 1. 基本用法 1、使用 defineEmits 子组件 <template><div…...
java在实际开发中反常识bug
目录 1.背景 2.案例 1.包装类型拆箱导致空指针异常 2.switch传入null,导致空指针异常 3.Arrays.asList添加异常 4.转BigDecimal类型时精度丢失 5.除以0不一定抛异常 6.Steam filter后集合修改,会修改原数据 3.完美&评论 1.背景 这篇博客,将列举本人在实际开发中看…...

wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...

Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...

3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...

家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...