当前位置: 首页 > news >正文

算法学习(十)—— 字符串

关于字符串操作

这类题一般是和其它算法合起来,比如模拟,双指针,动态规划或者回溯等,所以字符串相关的题目类型一般是非常非常丰富的,这里我们选取几道经典的题目进行讲解

部分OJ题详解

14. 最长公共前缀

14. 最长公共前缀 - 力扣(LeetCode)

题目题意还是很简单的,就是返回单词的公共前缀,没有公共前缀就返回空,下面来分析下这道题:

  • 解法一:两两比较,找公共前缀;假设有四个字符串,分成三组,每两组找公共前缀,然后再两个前缀再找公共前缀,最终结果就是所有字符串的公共前缀,这道题我们主要就是解决“如何找到两个字符串的公共前缀”,很简单,定义两个指针即可
  • 解法二:统一比较;就是定义一个指针,然后一次性比较所有字符串的前缀,当有空或者有一个字符不一样,停止遍历,返回结果。

解法一: 

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; }string findCommon(string s1, string s2){int i = 0;while(i < min(s1.size(), s2.size()) && s1[i] == s2[i]) i++;//i是遍历两个字符串的指针,所以i的大小必须小于等于最短的那个字符串,不然会越界访问return s1.substr(0, i);}
};

解法二:

class Solution {
public:string longestCommonPrefix(vector<string>& strs) {for(int i = 0; i < strs[0].size(); i++) //我们可以先以第一个字符串为基准,后面再做判断{char tmp = strs[0][i]; //得到第一个字符串的具体一个字母for(int j = 1; j < strs.size(); j++)if(i == strs[j].size() || tmp != strs[j][i])return strs[0].substr(0, i);}return strs[0];}
};

5. 最长回文字串

5. 最长回文子串 - 力扣(LeetCode)

题目要我们找出一个字符串s中的最长回文字串,其中这个字串是一串连续的字串,下面我们来分析下这道题:

  • 解法:中心扩展算法;这个算法的本质还是暴力枚举,但是这里是利用了回文串的特性来做枚举的,比正常枚举要快
  • 我们先固定一个位置,假设为i,然后定义两个指针,向前向后移动,因为如果是回文,左边和右边的字符是对称的,所以指针移动的时候,如果指针指向的值相同,就继续移动,如果不一样了,记录结果
  • 但是这样只能找奇数的回文字串,偶数的找不了,所以我们固定i,先left = right找奇数找一次,然后再right = left + 1,再找偶数找一次,就能把奇数偶数全找到
  • 步骤:1,固定一个中心点    2,从中心开始,向两边扩展,奇数偶数各找一次
class Solution {
public:string longestPalindrome(string s) {int begin = 0, len = 0; for(int i = 0; i < s.size(); i++) //依次枚举所有的中点{//先找奇数的扩展int left = i, right = i;while(left >= 0 && right < s.size()){if(s[left] == s[right]){left--;right++;}elsebreak;}if(right - left - 1 > len){begin = left + 1;len = right - left - 1;}//再做偶数的扩展left = i, right = left + 1;while(left >= 0 && right < s.size()){if(s[left] == s[right]){left--;right++;}elsebreak;}if(right - left - 1 > len){begin = left + 1;len = right - left - 1;}}    return s.substr(begin, len);}
};

67. 二进制求和

67. 二进制求和 - 力扣(LeetCode)

这个题目是一道经典的算法题,用到的算法是“高精度加法”,而同样的还是高精度减法,乘法和触发。而高精度顾名思义就是一个数实在是太大,平常的数据类型存不下,然后我们要对这种很大的数字进行运算,用到的算法就是“高精度运算”

下面我们来分析下这道题:

  • 解法:模拟列竖式运算。这道题和我们链表章节的“两数相加”那个题目很相似,我们定义一个t = 0记录相加的结果,具体步骤和链表的“两数相加”很像:算法学习(八) —— 链表-CSDN博客
class Solution {
public:string addBinary(string a, string b) {string ret;int cur1 = a.size() - 1, cur2 = b.size() - 1, t = 0;while(cur1 >= 0 || cur2 >= 0 || t){if(cur1 >= 0)t += a[cur1--] - '0';if(cur2 >= 0)t +=b[cur2--] - '0';ret += t % 2 + '0';t /= 2;}reverse(ret.begin(), ret.end());return ret;}
};

43. 字符串相乘

43. 字符串相乘 - 力扣(LeetCode)

这一题用到的就是我们上一题提到的“高精度乘法”这个算法,题目很简单,就是把字符串的值相乘,注意不能使用stoi和to_string等字符串整型转换函数,因为这时题目要求的,下面来解释下这道题:

  • 解法一:模拟列竖式运算;步骤一:单独拿nums2的一位和num1相乘    步骤而:再把所有的结果累加起来。
  • 细节一:高位相乘的时候,要补0     细节二:处理前导0    细节三:注意计算结果的顺序(可以看到解法一思路很简单,但是细节很多很多,稍不注意就会出错,所以解法一的代码不太好写)
  • 解法二:对解法一做优化 --> 五进位相乘再相加,最后处理进位
  • 对于步骤②,我们可以搞一个数组int[m + n - 1] tmp,m是num1的程度,n是num2的长度,然后我们就可以直接相加,因为同一列算出来的数存进数组时,下标是一样的,可以直接相加
  • 对于步骤③,就是处理进位,就是遍历一次数组,然后一边累加再放到最终字符串ret里
  • 细节:处理前导零 

 解法一的代码太复杂就不写了,我们直接用解法二来写:

class Solution {
public:string multiply(string num1, string num2) {//解法二:无进位相乘然后相加,最后处理进位//1,准备工作reverse(num1.begin(), num1.end());    reverse(num2.begin(), num2.end()); //逆序是为了方便处理前导零int m = num1.size(), n = num2.size();vector<int> tmp(m + n - 1); //存储步骤②的结果,顺便实现相加//2,无进位相乘再相加for(int i = 0; i < m; i++){for(int j = 0; j < n; j++)tmp[i + j] += ((num1[i] - '0') * (num2[j] - '0'));}//3,处理进位int cur = 0, t = 0; //cur遍历数组,t表示进位string ret; //存储最终结果while(cur < m + n - 1 || t != 0){if(cur < m + n - 1) t += tmp[cur++];ret += (t % 10) + '0';t /= 10;}//4,处理前导零while(ret.size() > 1 && ret.back() == '0') ret.pop_back();reverse(ret.begin(), ret.end());return ret;}
};

相关文章:

算法学习(十)—— 字符串

关于字符串操作 这类题一般是和其它算法合起来&#xff0c;比如模拟&#xff0c;双指针&#xff0c;动态规划或者回溯等&#xff0c;所以字符串相关的题目类型一般是非常非常丰富的&#xff0c;这里我们选取几道经典的题目进行讲解 部分OJ题详解 14. 最长公共前缀 14. 最长…...

「Mac畅玩鸿蒙与硬件16」鸿蒙UI组件篇6 - List 和 Grid 组件展示数据列表

List 和 Grid 是鸿蒙开发中的核心组件&#xff0c;用于展示动态数据。List 适合展示垂直或水平排列的数据列表&#xff0c;而 Grid 则适用于展示商品或图片的网格布局。本篇将展示如何封装组件&#xff0c;并通过按钮实现布局切换&#xff0c;提升界面的灵活性和用户体验。 关键…...

masm汇编字符输入小写转大写演示

从键盘读取一个字符变成大写换行并输出 assume cs:codecode segmentstart:mov ah,1int 21hmov bl,alsub bl,20hmov dl,10mov ah,2int 21hmov dl,blmov ah,2int 21hmov ah,4chint 21hcode ends end start 效果演示&#xff1a;...

防火墙|WAF|漏洞|网络安全

防火墙|WAF|漏洞|网络安全 防火墙 根据内容分析数据包&#xff1a; 1、源IP和目的IP地址 2、有效负载中的内容。 3、数据包协议&#xff08;例如&#xff0c;连接是否使用 TCP/IP 协议&#xff09;。 4、应用协议&#xff08;HTTP、Telnet、FTP、DNS、SSH 等&#xff09;。 5…...

继承机制深度解析:从基础到进阶的完整指南

文章目录 1. 继承的概念及定义1.1 继承的概念&#xff1a;1.2继承的定义&#xff1a;1.2.1 定义格式1.2.2 继承基类成员访问方式的变化&#xff1a; 1.3继续类模板 2. 基类和派生类间的转换2.1 向上转换&#xff08;Upcasting&#xff09;2.2 向下转换&#xff08;Downcasting&…...

8. 数据结构——邻接表、邻接矩阵的基本操作

一、邻接表 1. 内容 2. 实现代码(直接可以复制使用) //邻接表的相关操作 #include<bits/stdc.h> #define MVnum 100 #define OK 1 #define ERROR -1 using namespace std;typedef int Status; typedef char VerTexType; //假设顶点的数据类型为char typedef int ArcT…...

OpenCV Python 版使用教程(二)摄像头调用

文章目录 一、上篇回顾二、使用步骤1. 调用摄像头的 API 介绍2. 代码示例3. 代码分析 三、下篇预告 一、上篇回顾 在上一篇中&#xff0c;简单介绍了如何在 Windows 和 Ubuntu 两个环境下部署和安装 OpenCV&#xff0c;从本篇开始将逐步介绍 OpenCV 中的常见操作。 本篇介绍 …...

基础算法——排序算法(冒泡排序,选择排序,堆排序,插入排序,希尔排序,归并排序,快速排序,计数排序,桶排序,基数排序,Java排序)

1.概述 比较排序算法 算法最好最坏平均空间稳定思想注意事项冒泡O(n)O( n 2 n^2 n2)O( n 2 n^2 n2)O(1)Y比较最好情况需要额外判断选择O( n 2 n^2 n2)O( n 2 n^2 n2)O( n 2 n^2 n2)O(1)N比较交换次数一般少于冒泡堆O( n l o g n nlogn nlogn)O( n l o g n nlogn nlogn)O( n l…...

几种常见的处理ARP欺骗的方法:静态ARP表和VLAN等

ARP&#xff08;Address Resolution Protocol&#xff09;欺骗是一种常见的网络攻击手段&#xff0c;攻击者通过伪造ARP响应&#xff0c;将网关的MAC地址指向攻击者的MAC地址&#xff0c;从而截获或篡改网络流量。为了应对ARP欺骗攻击&#xff0c;现代网络设备和管理员采取了一…...

突破1200°C高温性能极限!北京科技大学用机器学习合成24种耐火高熵合金,室温延展性极佳

在工程应用中&#xff0c;如燃气轮机、核反应堆和航空推进系统&#xff0c;对具备优异高温机械性能的金属合金需求十分旺盛。由于材料熔点的固有限制&#xff0c;传统镍基 (Ni) 高温合金的耐温能力已接近极限。为满足开发高温结构材料的需求&#xff0c;耐火高熵合金 (RHEAs) 于…...

ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源 或者超时失效

数据治理过程中&#xff0c;有字段长度不够&#xff0c;扩展字段&#xff0c;报&#xff1a;ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源 或者超时失效 ALTER TABLE LAPD_RSJ_CXJMYLBXCBXX MODIFY HKXZ VARCHAR2(10);错误表示当前会话在试图访问的资源&#xff08;通常…...

Python学习笔记-断点操作结合异常处理

在编程中,调试和错误处理是提升代码质量和开发效率的关键环节。调试能帮助识别并修复问题,异常处理则使得程序能在出现错误时有效地管理而不至于崩溃。断点与异常处理的结合应用是高级编程中不可或缺的技巧,能够帮助更高效地定位问题,提高程序的鲁棒性。 本文将通过详细的…...

Java实现JWT登录认证

文章目录 什么是JWT?为什么需要令牌?如何实现?添加依赖&#xff1a;JwtUtils.java&#xff08;生成、解析Token的工具类&#xff09;jwt配置&#xff1a;登录业务逻辑&#xff1a;其他关联代码&#xff1a;测试&#xff1a; 什么是JWT? JWT&#xff08;Json Web Token&…...

「Mac畅玩鸿蒙与硬件20」鸿蒙UI组件篇10 - Canvas 组件自定义绘图

Canvas 组件在鸿蒙应用中用于绘制自定义图形&#xff0c;提供丰富的绘制功能和灵活的定制能力。通过 Canvas&#xff0c;可以创建矩形、圆形、路径、文本等基础图形&#xff0c;为鸿蒙应用增添个性化的视觉效果。本篇将介绍 Canvas 组件的基础操作&#xff0c;涵盖绘制矩形、圆…...

山东路远生态科技有限公司竣工投产仪式暨产品发布会圆满举行

第二十届三中全会于2024年7月15日至18日在北京举行。全会审议通过了《关于进一步全面深化改革、推进中国式现代化的决定》。其中提到,“要健全因地制宜发展新质生产力体制机制”。 新质生产力是由技术革命性突破、生产要素创新性配置、产业深度转型升级而催生的当代先进生产力…...

java: 题目:银行账户管理系统

题目&#xff1a;银行账户管理系统 设计一个简单的银行账户管理系统。要求实现以下功能&#xff1a; 1. 创建一个银行账户 BankAccount 类&#xff0c;该类具有以下属性&#xff1a;accountNumber&#xff08;账户号码&#xff0c;类型为 String&#xff09; balance&#xff…...

PH热榜 | 2024-11-06

DevNow 是一个精简的开源技术博客项目模版&#xff0c;支持 Vercel 一键部署&#xff0c;支持评论、搜索等功能&#xff0c;欢迎大家体验。 Github&#xff1a;https://github.com/LaughingZhu/DevNow 1. MindOne Builder 标语&#xff1a;这是一个“设计优先”的应用构建工具…...

五、Java并发 Java Google Guava 实现

Guava 是托管在 Github.com 上的流行的 Google 开源的 Java 线程池库。 Guava 包含了许多有用的并发类&#xff0c;同时还包含了几个方便的 ExecutorService 实现&#xff0c;但这些实现类都无法通过直接实例化或子类化来创建实例。取而代之的是提供了 MoreExecutors 助手类来…...

ssm公交车信息管理系统+vue

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码看文章最下面 需要定制看文章最下面 目 录 摘要 I Abstract II 第1章 绪 论 1 1.1 研究背景 1 1.2 研究意义 1 1.3 国内外研究现状 …...

如何删除react项目的默认图标,使在浏览器中不显示默认图标favicon.ico

要删除 React 项目的默认图标&#xff0c;使在浏览器中不显示默认图标favicon.ico&#xff0c;其实有两种方法&#xff1a; 方法一 方法要点&#xff1a;删除掉 public 目录下的 favicon.ico 文件&#xff0c;再用浏览器访问时&#xff0c;如果加载不到图标文件&#xff0c;就…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型&#xff08;Vision-Language Models, VLMs&#xff09;&#xff0c;为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展&#xff0c;机器人仍难以胜任复杂的长时程任务&#xff08;如家具装配&#xff09;&#xff0c;主要受限于人…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分&#xff1a;派生类构造函数与析构函数 当创建一个派生类对象时&#xff0c;基类成员是如何初始化的&#xff1f; 1.当派生类对象创建的时候&#xff0c;基类成员的初始化顺序 …...