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

news2024/9/20 12:36:13

文章目录

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

前言

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

最长公共前缀

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.coloradmin.cn/o/2059253.html

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

相关文章

CISAW安全集成和别的类型有什么区别

信息安全人员认证&#xff08;Certified Information Security Assurance Worker, CISAW&#xff09;是由中国网络安全审查技术认证中心依据信息安全领域的不同专业、技术和应用方向以及安全岗位需求&#xff0c;按照ISO/IEC 17024标准建立的多层次认证体系。 CISAW分为三个主…

web前端之选项卡的实现、动态添加类名、动态移除类名、动态添加样式、激活、tabBar

MENU 原生vue 原生 效果图 html 代码 <div class"card"><div class"tab_bar"><div class"item" onclick"handleTabBar(this)">tabBar1</div><div class"item" onclick"handleTabBar(this…

哈佛大学年中回顾2024年ESG发展近况

--- 兼谈新能源企业出海之ESG营销战略 2024年上半年&#xff0c;环境、社会和治理&#xff08;ESG&#xff09;问题以及对方法的不同意见继续成为全球头条新闻。今年年初&#xff0c;公司及其利益相关者在ESG的支持者和批评者之间进行了权衡&#xff0c;虽然近几个月ESG的势头…

cesium添加弹窗,跟随实体移动

先看效果&#xff0c;弹窗会跟随实体移动 1、首先我们先写一个弹窗样式&#xff0c;如果是vue开发&#xff0c;css最好写到公共引入的css &#xff0c;组件内css会编译后会加hash值 2、然后我们 开启 cesium的监听事件&#xff0c; 注意的是 initBubbleWindow方法在地球加载后…

控制阶段在DMAIC中的主要目标是什么?

在探讨DMAIC&#xff08;定义Define、测量Measure、分析Analyze、改进Improve、控制Control&#xff09;这一持续改进流程时&#xff0c;控制阶段作为整个循环的尾声&#xff0c;其重要性不言而喻。控制阶段的主要目标不仅在于巩固前期努力所取得的成果&#xff0c;更在于确保这…

EXCEL 分段排序--Excel难题#86

Excel某表格有3列。 ABC1A1B1512A2B27213A3B33824A4B495A5B5736A6B65777A7B7918A13B131509A14B144910A17B1770211A18B1870512A34B343313A35B3540914A36B3657915A37B3710 现在要求对表格按照第3列进行分段排序&#xff0c;由小到大排列。第1段&#xff1a;第3列小于等于50&…

UE5 datetime 创建日期时间节点 进行加法减法。个人理解

以下均为个人实验和个人理解&#xff0c;仅供参考。 目录 目标节点&#xff1a; 年月日 时分秒毫秒 目标节点&#xff1a; 年月日 年月日以1 为基底。若填的数字<0&#xff0c;该节点会失效。 试验&#xff1a; year基底为1&#xff0c;正常 year基底为0&#xff0c;异…

主流AI绘画工具StableDiffusion最新模型sd3本地部署方法(附工作流)

前言/introduction Stable Diffusion 3&#xff08;简称SD3&#xff09;是Stability AI最新推出的文本到图像生成模型。相比前代模型&#xff0c;SD3在生成质量、细节表现以及运行效率上有了显著提升&#xff0c;尤其在细腻的图像渲染和复杂的场景构建方面表现出色。SD3模型提…

【Harmony OS 4.0】页面路由跳转代码示例

ets/pages/Index.ets import router from ohos.router;Entry Component struct Index {State title: string Index Page;State message: string onPageShow(): void { // 页面每次显示时触发。使用aboutToAppear页面没反应。let record router.getParams() as Record<st…

微服务多个模块启动,端口被占用,yml配置文件读不到

刚刚提交到gitee自己的仓库&#xff0c;拉下来还是报错&#xff0c;然后看到一个解决方法&#xff1a; <build><resources><resource><directory>src/main/java</directory><includes><include>**/*.yml</include><includ…

医院信息管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图详细视频演示技术栈系统测试为什么选择我官方认证玩家&#xff0c;服务很多代码文档&#xff0c;百分百好评&#xff0c;战绩可查&#xff01;&#xff01;入职于互联网大厂&#xff0c;可以交流&#xff0c;共同进步。有保障的售后 代码参考数据库参…

神经重建在自动驾驶模拟中的应用

验证自动驾驶软件需要数百万公里的测试。这不仅意味着系统开发周期长&#xff0c;而且系统的复杂度也会不断增加&#xff0c;同时&#xff0c;大规模的实车测试也会耗费巨量的资源并且可能会面临未知的安全问题。aiSim这样的虚拟仿真工具可以减轻真实世界测试的负担。 AD和ADA…

学习ComfyUI的一个不错网站:www.comflowy.com/basics

学习ComfyUI&#xff0c;不仅仅是照搬别人的工作流来使用&#xff0c;重要的是能自己搭建工作流&#xff0c;而要能够熟练搭建&#xff0c;离不开对工作流中节点&#xff08;特别是重要节点&#xff09;的透彻理解。比如我自己&#xff0c;原来对 Lora 就十分陌生&#xff0c;不…

一款好看的WordPress REST API 主题

介绍&#xff1a; 主题特色&#xff1a; 使用Nuxtjs WordPress Rest Api 实现前后端分离&#xff0c;可完成多端部署&#xff1b; 主题支持自动切换黑夜模式。 使用说明&#xff1a; service 目录为wordpress主题文件&#xff0c;需要拷贝到wordpress主题目录下&#xff0…

创建uni-app项目(vue3+ts+vite)

npx degit dcloudio/uni-preset-vue#vite-ts m-uni-demo1 跳转到对应目录&#xff0c;装包&#xff0c;运行 cd m-uni-demo1 yarn yarn dev:h5 tsconfig.json: {"extends": "vue/tsconfig/tsconfig.json","compilerOptions": {"ignoreDepr…

项目实战--SpringBoot整合EasyExcel实现数据导入导出

SpringBoot整合EasyExcel实现数据导入导出 一、前言二、实践2.1 实体类注解方式2.2 动态参数化导出导入 一、前言 在公司业务系统开发过程中&#xff0c;操作 Excel 实现数据的导入导出是个非常常见的需求。 最近公司的项目采用EasyPoi来实现的&#xff0c;但是在数据量大的情…

用git指令别名,解决unity环境问题

文章目录 背景问题解决尝试1尝试2尝试3 背景 unity 项目开发时&#xff0c;由于我本机的配置和项目组其他小伙伴的配置不一样&#xff0c;使用统一的配置打开项目会出现花屏的现象&#xff0c;经过摸索尝试&#xff0c;需要修改 unity 的Project Settings。修改之后&#xff0…

骑行耳机品牌前五名排行榜:5大优质骑行耳机闭眼入都不踩雷!

近年来&#xff0c;骨传导耳机市场迅速崛起&#xff0c;但伴随着这股热潮&#xff0c;市场上也出现了诸多鱼龙混杂的杂牌品牌&#xff0c;有不少非专业的产品趁机涌入市场。这些骑行耳机在骨传导技术、防水性能、稳定性及音效调校等上百项关键指标上缺乏深入研发与优化&#xf…

FastGPT+ollama 搭建私有AI大模型智能体工作流-Mac

一、大模型工作流的优势 1. 降低任务门槛&#xff1a;工作流可以将复杂任务分解成多个小任务&#xff0c;降低每个任务的复杂度&#xff0c;从而减少对提示词和大模型推理能力的依赖。这样可以提升大模型处理复杂任务的性能和容错能力。 2. 提升任务效率&#xff1a;工作流可以…

在选择或推荐数据恢复软件之前,您如何测试和审查它?

数据恢复软件可以帮助您从各种存储设备中检索丢失或删除的文件&#xff0c;例如硬盘驱动器&#xff0c;USB闪存驱动器&#xff0c;存储卡或智能手机。但是&#xff0c;并非所有数据恢复软件都是一样的&#xff0c;根据您的情况和需求&#xff0c;有些软件的性能可能比其他软件更…