算法_字符串专题---持续更新

文章目录

  • 前言
  • 最长公共前缀
    • 题目要求
    • 题目解析
    • 代码如下
  • 最长回文子串
    • 题目要求
    • 题目解析
    • 代码如下
  • 二进制求和
    • 题目要求
    • 题目解析
  • 字符串相乘
    • 题目要求
    • 题目解析
    • 代码如下

前言

本文将会向你介绍有关字符串的相关题目:最长公共前缀、最长回文子串、二进制求和、字符串相乘。本篇并不是介绍字符串相关的算法,只是将题目要求为字符串类型的归类

最长公共前缀

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;}

三、去掉前导0

如果123 乘 0 按照我们以上的模拟乘法,将会得出000,因此需要把前两个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;}
};

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

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

相关文章

GDB的基本使用(1)

我有话说 因为时间和精力原因&#xff0c;本文写的虎头蛇尾了&#xff0c;除了启动调试与程序执行以外只有少量截图演示&#xff0c;只是简单的说明。如果有需要可以联系我&#xff0c;我有时间的话会把演示补上&#xff0c;谢谢理解。 启动调试与程序执行 启动调试并传递参数…

linux环境下通过源码编译的方式安装mysql8.0.16版本

文章目录 前言一、资源准备1.源码下载2.依赖命令安装2.1 安装依赖包2.2 安装高版本gcc2.3 安装高版本cmake 二、编译安装mysql1.解压mysql-boost-8.0.16安装包2.执行编译命令3.执行make命令4.执行make install 命令5.编译安装完成后结果检查 三、初始化mysql1. 创建数据相关目录…

在ubuntu16.04下使用词典工具GoldenDict

前言 本来要装有道词典&#xff0c;结果发现各种问题&#xff0c;放弃。 网上看大家对GoldenDict评价比较高&#xff0c;决定安装GoldenDict 。 安装 启动 添加词库 GoldenDict本身并不带词库&#xff0c;需要查词的话&#xff0c;必须先下载离线词库或者配置在线翻译网址才…

SQL每日一练-0816

今日SQL题&#xff1a;计算每个项目的年度收入增长率 难度系数&#xff1a;&#x1f31f;☆☆☆☆☆☆☆☆☆ 1、题目要求 计算每个项目每年的收入总额&#xff0c;并计算项目收入环比增长率。找出每年收入增长率最高的项目。输出结果显示年份、项目ID、项目名称、项…

OD C卷 - 查找一个有向网络的头节点和尾节点

查找一个有向网络的头节点和尾节点 &#xff08;200&#xff09; 在一个有向图中&#xff0c;有向边用两个整数表示&#xff0c;第一个整数表示起始节点&#xff0c;第二个整数表示终止节点&#xff1b;图中只有一个头节点&#xff0c;一个或者多个尾节点&#xff1b;图可能存…

RTX 40全系10款显卡《黑神化:悟空》测试:打开DLSS3帧生成 性能直翻4倍

一、前言&#xff1a;《黑神话&#xff1a;悟空》临近发布 RTX 40系显卡表现如何&#xff1f; 2020年8月20日&#xff0c;游戏科学发布了《黑神话&#xff1a;悟空》的首个实机演示预告&#xff0c;惊艳了整个游戏行业&#xff01; 以往&#xff0c;很多人认为国产开发商做不出…

华为数通方向HCIP-DataCom H12-821题库(更新单选真题:1-10)

第1题 1、下面是一台路由器的部分配置,关于该配置描述正确的是? [HUAWEllact number 2001 [HUAWEl-acl-basic-2001]rule 0 permit source 1.1.1.1 0 [HUAWEl-acl-basic-2001]rule 1 deny source 1.1.1.0 0 [HUAWEl-acl-basic-2001]rule

Java实现STL中的全排列函数next_permutation()

目录 一、引言 二、全排列函数next_permutation() 三、next_permutation()的使用 四、Java实现next_permutation() 五、使用next_permutation()实现全排列 一、引言 相信很多小伙伴们都做过全排列的算法题&#xff0c;输入一个n&#xff0c;输出1~n的全排列。对于这个问题…

jemeter压力测试入门

1. 安装jemeter的压缩包并且解压 点击运行 2. 添加线程组 3. 线程组的参数设置 4. 添加http请求 5. 填写请求信息 添加监听器——结果树&#xff08;结果&#xff09;&#xff0c;聚合报告&#xff08;吞吐量报告&#xff09; 6. 通过cvs数据文件设置&#xff0c;配置元件&…

ARM 裸机与 Linux 驱动对比及 Linux 内核入门

目录 ARM裸机代码和驱动的区别 Linux系统组成 内核五大功能 设备驱动分类 内核类型 驱动模块 驱动模块示例 Makefile配置 命令 编码辅助工具 内核中的打印函数 printk 函数 修改打印级别 ​编辑 打印级别含义 驱动多文件编译 示例 模块传递参数 命令行传递参数…

jmeter简单发送接口

一、安装jmeter 拥有java环境&#xff0c;再下载jmeter 安装之后解压到本地&#xff0c;jmeter中的bin目录配置到环境变量中 之后可以通过cmd中 jmeter.bat命令运行 二、利用jmeter发送接口请求 1、添加线程组 添加->线程->线程组 2、添加http请求 添加->取样器-&g…

利用Matlab求解高阶微分方程(ode45)

1、高阶微分方程的基本概念 二阶以及二阶以上的微分方程称之为高阶微分方程&#xff0c;一般来说&#xff0c;微分方程的阶数越高&#xff0c;求解的难度也就越大。求高阶方程的一个常用方法就是降低阶数。对二阶方程 &#xff0c;如果能用变量代换把它化成一阶方程&#xff0c…

学习记录——day33 HTTP

目录 一、HTTP相关概念 二、客服端请求 1、请求首部 2、 响应首部 三、线程实现HTTP并发服务器 一、HTTP相关概念 1、HTTP&#xff0c;全称Hyper Text Transfer Protocol&#xff0c;用于万维网&#xff08;world wide web&#xff09;进行超文本学习的传输协议 2、HTTP属…

计算xpclr

1.conda安装xpclr 首先安装流程很轻松 conda create -n xpclr -c bioconda xpclr conda activate xpclr xpclr -h 2.按照要求准备文件 XPCLR - 简书 (jianshu.com) 根据教程准备文件&#xff0c;vcf&#xff0c;计算好的map&#xff0c;以及样本文件txt 其实官网也有介绍…

Docker基础概述、Docker安装、Docker镜像加速、Docker镜像指令

1.为什么学docker 开发环境与测试环境不同&#xff0c;导致错误 因此docker提供解决方法———系统平滑移植&#xff0c;容器虚拟化技术 将代码与软件与配置文件 打包成一个镜像 2.docker的历练 创建一个开发环境内成为镜像文件再用docker使用镜像 3.什么是docker Docke…

MySQL5.7数据库---入门教程(小白教程)

一、MySQL安装 本文以MySQL5.7安装为例。在设置完root密码和添加一个用户后&#xff0c;一路默认。 1、 2、通过点击红圈里的箭头选择对应的版本。 3、 4、端口&#xff08;Port&#xff09;一般默认不需要更改。 5、 二、配置环境变量 配置环境变量可以方便在win系统中cmd…

流媒体服务器二 3学习 librtmp 库的配置使用

librtmp 库是个啥&#xff1f; librtmp是一个开源的基于C语言的库&#xff0c;提供了一个连接RTMP服务器&#xff0c;发送和接收RTMP流的API。 它可以用来开发流媒体播放器&#xff0c;网络直播等应用。它的主要特点是快速、稳定和低延迟。 librtmp支持RTMP&#xff0c;RTMPS…

Qt第十七章 多线程

文章目录 多线程1. 线程概念的起源2. 三种方式创建线程3. 启动线程前的准备工作4. 启动线程/退出线程5. 操作运行中的线程6. 为每个线程提供独立数据7.子线程不能操作ui解决方案 多线程 1. 线程概念的起源 单核CPU 早期还没有线程的概念&#xff0c;如何保证2个进程同时进行呢…

基于Java爬取微博数据(四) 获取 图片 or 视频

基于Java爬取微博数据四 获取 图片 or 视频 图片 or 视频转存 图片 or 视频注意点 前面已经讲述了基于 Java 爬取微博正文列表内容&#xff0c;微博用户主页内容以及导出爬取到的微博数据等操作&#xff0c;那么下面讲述一下如何处理微博正文中的图片/视频等内容。 图片 or 视…

(转载)使用zed相机录制视频

参照下面这个链接 https://blog.csdn.net/peng_258/article/details/127457199?ops_request_misc&request_id&biz_id102&utm_termzed2%E5%BD%95%E5%88%B6%E6%95%B0%E6%8D%AE%E9%9B%86&utm_mediumdistribute.pc_search_result.none-task-blog-2~all~sobaiduweb…