【算法】字符串相关

news2024/9/28 13:52:56

【ps】本篇有 4 道 leetcode OJ。

一、算法简介

        字符串是一种数据结构,大多与别的算法结合在一起出题,例如模拟、高精度算法、双指针、dp、回溯等,因此这个专题的题型本身是特别丰富的。本篇选取了较为典型的字符串题型,除了涵盖一些常用算法,还包括经常用到的容器、接口等。

二、相关例题

1)最长公共前缀

14. 最长公共前缀

.1- 题目解析

        我们可以对每个字符串进行两两比较,先找出一个公共前缀,再用这个公共前缀,与剩余的字符串进行两两比较,以此类推,直到得出最终结果。

         当然,也可以进行统一的比较,用一个指针来遍历所有字符串,当指针所指位置的字符不相同时,就找出了公共前缀。

.2- 代码编写

//两两比较
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++;
        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() || strs[j][i]!=tmp)
                {
                    return strs[0].substr(0,i);
                }
            }
        }
        return strs[0];
    }
};

2)最长回文子串

5. 最长回文子串

.1- 题目解析

        我们可以利用回文串的性质,先在字符串中固定一个中心位置,然后用两个指针从中心位置向左右两边扩展,直到找出两侧都不相等的字符为止。

.2- 代码编写

class Solution {
public:
    string longestPalindrome(string s) {
        int begin=0,len=0;//记录结果
        int n=s.size();
        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)
            {
                begin=left+1;
                len=right-left-1;
            }
            //偶数长度的扩展
            left=i,right=i+1;
            while(left>=0 && right<n && s[left]==s[right])
            {
                left--;
                right++;
            }
            if(right-left-1>len)
            {
                begin=left+1;
                len=right-left-1;
            }
        }
        return s.substr(begin,len);
    }
};

3)二进制求和

67. 二进制求和

.1- 题目解析

        本题是一道高精度加法,只需模拟竖式计算的过程即可。

.2- 代码编写

class Solution {
public:
    string addBinary(string a, string b) {
        int cur1=a.size()-1,cur2=b.size()-1;
        int t=0;//记录当前结果和下次进位
        string ret;//记录结果
        //模拟竖式计算,从低位到高位依此计算
        while(cur1>=0||cur2>=0||t!=0)
        {
            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());//由于+=操作,ret中的结果其实是倒序的,因此逆序操作一次
        return ret;
    }
};

4)字符串相乘

43. 字符串相乘

.1- 题目解析

        本题是一道高精度乘法,只需模拟竖式计算的过程即可。

        在竖式的乘法中,第一个数会与第二个数的每一位分别相乘得到一个结果,然后将这些结果相加起来就可以得到最终结果了。

        特别的,在进行高位相乘时,要在末位补上合适的 0。且在编写代码时,由于我们是低位向高位依此计算的,并将结果添加至一个字符串的末尾,因此模拟计算的结果其实是倒序的,我们还需要对其进行逆序操作。

        不过,我们可以在模拟计算时,暂时先不处理进位,等到要将所有相乘的结果累加得出最终结果时,再统一处理进位。 

        具体的方式是,先用一个数组来存放所有相乘的结果,再模拟它们进位相加的过程。 

        另外,对于一些特殊的结果,还要处理它们的前导 0。

      

.2- 代码编写

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();
        //2.先进位相乘,再相加
        vector<int> tmp(m+n-1);
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                tmp[i+j]+=(num1[i]-'0')*(num2[j]-'0');
            }
        }
        //3.处理进位
        string ret;
        int cur=0,t=0;
        while(cur<m+n-1||t)
        {
            if(cur<m+n-1)t+=tmp[cur++];
            ret+=t%10+'0';
            t/=10;
        }
        //4.处理前导0
        while(ret.size()>1 && ret.back()=='0')
            ret.pop_back();

        reverse(ret.begin(),ret.end());
        return ret;
    }
};

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

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

相关文章

双端之Nginx+Php结合PostgreSQL搭建Wordpress

第一台虚拟机:安装 Nginx 更新系统包列表: sudo apt update安装 Nginx及php扩展: sudo apt install nginx php-fpm php-pgsql php-mysqli -y启动 Nginx 服务: sudo systemctl start nginx检查 Nginx 是否正常运行: xdg-open http://localhost注意:终端命令打开网址 …

【射频通信电子线路第六讲】射频信号与调制包括调幅和部分调频的内容

一、调制&#xff08;Modulation&#xff09;与解调&#xff08;Demodulation&#xff09; 1、相关概念 调制是指使一个信号&#xff08;如光信号、高频电磁振荡等&#xff09;的某些参数&#xff08;振幅、频率和相位&#xff09;按照另一个欲传输的信号的特点变化的过程。 …

Linux基础(二):磁盘分区

1.磁盘在Linux中的文件名 SATA接口的磁盘在Linux中名字为/dev/sdx。/dev 几乎是所有外接设备存放的文件夹&#xff1a; 磁盘在Linux中的文件名是不确定的&#xff0c;比如拿一个U盘插到Linux主机&#xff0c;可能第一次名字为sda&#xff0c;拔插后名字为sdc&#xff0c;这取…

新160个crackme - 067-CarLitoZ.1

运行分析 需要破解Code PE分析 VB程序&#xff0c;32位&#xff0c;无壳 静态分析&动态调试 使用VB Decompiler分析&#xff0c;发现注册模块需要满足var_18 var_ret_7var_18 abt.Label1.MousePointer 即输入框填入的信息var_ret_7 Mid(var_1C, 6, 1) Mid(var_20, 9, 1…

《Linux运维总结:使用 MongoDB工具备份和恢复mongodb 7.0.14分片集群(方案一)》

总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:《Linux运维篇:Linux系统运维指南》 一、备份说明 1、要使用mongodump备份分片集群,您必须 停止负载均衡器、 停止写入,避免备份的数据出现状态不一致问题。 2、从MongoDB7.0.2开始(也可以从6.0…

net core mvc 数据绑定 《1》

其它的绑定 跟net mvc 一样 》》MVC core 、framework 一样 1 模型绑定数组类型 2 模型绑定集合类型 3 模型绑定复杂的集合类型 4 模型绑定源 》》》》 模型绑定 使用输入数据的原生请求集合是可以工作的【request[],Querystring,request.from[]】&#xff0c; 但是从可读…

芝法酱学习笔记(0.3)——SpringBoot下使用mybatis做增删改查和报表

零、前言 书接上回&#xff0c;我们搭建了windows下的开发环境&#xff0c;并给出了一个hello world级别的多模块SpringBoot项目。 毕竟java后端开发&#xff0c;离不开数据库的操作&#xff0c;为方便后面内容的讲解&#xff0c;这里再做一期铺垫&#xff0c;core模块下新增一…

国际版多语言点赞抖音分享点赞任务平台源码

>>>系统简述&#xff1a; 本系统是一个国际化的点赞、分享任务平台的源代码&#xff0c;特别针对抖音这个短视频社交平台进行了定制。源码支持十二种不同的语言&#xff0c;旨在为用户提供一个全球化的服务环境&#xff0c;促进内容的传播和互动。首页可领取脸书tikt…

如何使用 DomCrawler 进行复杂的网页数据抓取?

在互联网时代&#xff0c;数据是宝贵的资源。无论是市场分析、客户洞察还是内容聚合&#xff0c;从网页中抓取数据都是一项关键技能。Symfony 的 DomCrawler 是一个强大的工具&#xff0c;可以帮助开发者从复杂的网页中提取所需的数据。本文将详细介绍如何使用 DomCrawler 进行…

学习Python的难点分析

一、语法灵活性带来的困惑 缩进规则 Python使用缩进来表示代码块&#xff0c;而不是像其他编程语言&#xff08;如C或Java&#xff09;使用大括号。这虽然使代码看起来简洁&#xff0c;但对于初学者来说可能会造成困扰。例如&#xff1a; if True:print("This is insid…

C语言开发基础新手快速入门及精通系列学习教程(系统性完整C语言学习笔记整理)

关注我&#xff0c;一起学编程 前言 作为一名拥有多年开发经验的码农&#xff0c;我的职业生涯涵盖了多种编程语言&#xff0c;包括 C 语言、C、C# 和 JavaScript。在这一过程中&#xff0c;我深刻地意识到扎实的基础对于编程学习的重要性&#xff0c;尤其是对于 C 语言…

React 启动时webpack版本冲突报错

报错信息&#xff1a; 解决办法&#xff1a; 找到全局webpack的安装路径并cmd 删除全局webpack 安装所需要的版本

这条挣钱的路,离我好遥远啊

近日&#xff0c;笔者在发表的《乱篇弹&#xff08;54&#xff09;让子弹飞》一文中写道&#xff1a;“ 当然&#xff0c;笔者在《博客中国-狼头长啸的作家专栏》耕耘期间&#xff0c;也赚了一些用以补贴自己养老的‘ 散碎银两’。那么笔者是否可以依照知乎网的‘申请开通权限’…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-28

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-28 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-28目录前言1. Cognitive phantoms in LLMs through the lens of latent variables摘要研究背景问题与挑战创新点算法模型实验效果…

Java项目实战II基于Java+Spring Boot+MySQL的大学城水电管理系统(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者 一、前言 随着大学城规模的不断扩大和学生数量的急剧增加&#xff0c;大学城内的水电管理面临着前所未有的挑战…

一个月涨粉15万!霸屏某书的“AI奶奶”怎么做?AI副业变现零基础入门教程

大家好&#xff0c;我是灵魂画师向阳 最近&#xff0c;大家可能在小红书刷到过不少“奶奶"账号。这些账号通常都打着人间清醒xxx的名号&#xff0c;比如人间清醒月亮奶奶 人间清醒柒奶奶 等。它们在小红书上的数据都不错&#xff0c;其中&#xff0c;”人间清醒柒奶奶“一…

InfluxDB数据库在Windows中的部署与运行

本文介绍在Windows电脑中&#xff0c;下载、安装、部署并运行InfluxDB数据库服务的方法。 InfluxDB是一个开源的时间序列数据库&#xff0c;专为处理时间序列数据而设计。它最初发布于2013年&#xff0c;目前已被广泛应用于监控、日志记录、物联网、实时分析等领域&#xff0c;…

使用AT command 修改手机APN

文章目录 使用AT command 修改手机APN其他AT command 使用AT command 修改手机APN 首先通过设备管理器查找到手机所使用的串口号。 然后通过putty 等串口连接软件&#xff0c;以telnet的方式连接手机。 连接成功后先&#xff0c;查看手机的 APN&#xff1a; ATCGDCONT可以用于…

AI技术在爱奇艺视频搜索中的应用

当前AI技术已经全面在爱奇艺搜索引擎中落地应用。与传统搜索仅能查找片名不同&#xff0c;爱奇艺的AI搜索功能让用户能够在搜索阶段使用更多模糊信息获得想找的影片。首次将生成式AI技术应用于角色搜索、剧情搜索、明星搜索、奖项搜索和语义搜索五大场景。通过对模糊搜索query的…

木材检测系统源码分享

木材检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …