【算法基础篇】-字符串

news/2025/2/26 7:40:56

字符串篇

  • 一、最长回文子串
  • 二、二进制求和
  • 三、字符串相乘
    • 今日分享这里

在这里插入图片描述

一、最长回文子串

最长回文子串
给你一个字符串 s,找到 s 中最长的 回文 子串。
在这里插入图片描述

讲解:

我们这里使用的是中心扩展方法,其实类似于暴力枚举,但是时间复杂度O(n*n)。算法的思路时固定一个位置,从中心开始,向两边扩展,如果最左边的值等于最右边时(满足回文串)。再左边向左走,右边向右走(前提不要越界)。
在求出长度即可和原来比较,返回值从begin到len。我们上面所说的是奇数扩展,偶数扩展让right等于left下一个位置

begin用来记录起始位置,len记录每次变化的长度。如果比原来大,就更新给len。

草图如下:
在这里插入图片描述

class Solution {
public:
    string longestPalindrome(string s) {
        //中心扩展
        int begin=0,len=0,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);
    }
};

二、二进制求和

二进制求和原题
在这里插入图片描述

讲解:

先讲解下二进制怎么求和的,还是跟列竖式运算差不多。只不过这里是逢2进0,如果俩数相加等于2,直接变零,不等于2,那就直接模2即可(结果是多少就多少),t%2表示运算最终结果,t/2表示进到下一位。

我们这里直接使用俩个指针遍历俩字符串数组的末尾,不过最终返回结果要逆序。

在这里插入图片描述

class Solution {
public:
    string addBinary(string a, string b) {
        string ret;//存放新的数组

        int cur1=a.size()-1,cur2=b.size()-1;
        int 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;
    }
};

附录:

开始做这道题没懂t是怎么运用的,原来让t是遍历俩字符串数组。贯穿进去的。


三、字符串相乘

字符串相乘原题
在这里插入图片描述


讲解:

这里讲解下思路;类似于模拟列竖式运算的方法,只不过这里模拟的时候,中间过程没有进位,最终结果统一进位。但是你会发现,这个方法结果算下来是对的。
然后在讲解下代码:首先反准下。分四部进行。我们给俩字符串都弄个下标(如下图绿色部分)。数组大体思路是 我们来定义个tmp数组来存放无进位相乘再相加的结果,存放进位结果的时候我们要注意:存放的位置应该放哪里?存放的位置应该是俩数相乘的下标(例如:3和5相乘时,放在数组下标1的位置.3对应下标0,5下标是1。再和3和4相乘的结果相加)。

在这里插入图片描述

处理完进位后,注意前导零。比如说。一个数和0相乘,结果只要一个0,但是会出现多个0,我们只需要保存一个0即可。当最终结果大于1且都是0时,保留一个字符0即可。最后还要反转回来。reverse下

在这里插入图片描述

class Solution {
public:
    string multiply(string n1, string n2) {
        //先无进位相乘
        //先反转
        int m=n1.size(),n=n2.size();
        reverse(n1.begin(),n1.end());
        reverse(n2.begin(),n2.end());
        vector<int>tmp(m+n-1);

        //第二步,无进位相乘再相加
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                tmp[i+j]+=(n1[i]-'0')*(n2[j]-'0');
            }
        }

        //处理进位
        int cur=0,t=0;
        string res;
        while(cur<m+n-1||t!=0)
        {
            if(cur<m+n-1)   t+=tmp[cur++];
            res+=t%10+'0';
            t/=10;
        }

        //处理前导0
        while(res.size()>1&&res.back()=='0')    res.pop_back();

        reverse(res.begin(),res.end());
        return res;

    }
};

今日分享这里


http://www.niftyadmin.cn/n/5868319.html

相关文章

Java集合性能优化面试题

Java集合性能优化面试题 初始化优化 Q1: 如何优化集合的初始化&#xff1f; public class CollectionInitializationExample {// 1. 合理设置初始容量public void initializationOptimization() {// 不好的实践&#xff1a;使用默认容量List<String> badList new Arr…

Java23种设计模式案例

目录 一、概述 二、创建型模式 (Creational Patterns) 单例模式 (Singleton Pattern) 工厂方法模式 (Factory Method Pattern) 抽象工厂模式 (Abstract Factory Pattern) 建造者模式 (Builder Pattern) 原型模式 (Prototype Pattern) 三、结构型模式 (Structu…

浏览器深度解析:打造极速、安全、个性化的上网新体验

在数字化时代,浏览器作为我们获取信息、娱乐休闲的重要工具,其性能与功能直接影响着我们的上网体验。今天,我将为大家介绍一款备受好评的浏览器——Yandex浏览器,并深入解析其独特功能与优势,帮助大家更好地了解并选择这款上网神器。 一、知名公司背书,开源项目融合 Yan…

@KafkaListener和KafkaTemplate自动装配原理分析

依赖项和配置信息参见另一篇博文KafkaListener的配置使用&#xff0c;这里主要借助源码分析KafkaListener和KafkaTemplate自动装配原理。 1、KafkaAutoConfiguration 源码分析 KafkaAutoConfiguration类自动装配生成了生产者客户端KafkaTemplate的bean和消费者基础ConsumerFa…

03、Hadoop3.x从入门到放弃,第三章:Windows测试环境搭建

Hadoop3.x从入门到放弃&#xff0c;第三章&#xff1a;Windows测试环境搭建 一、Windows测试环境搭建 预先安装好JDK环境&#xff0c;这里不在赘述。 1、下载Hadoop相关文件 Hadoop各版本安装包&#xff1a;https://archive.apache.org/dist/hadoop/common/ 【我选择的是ha…

上证50期权代码是什么?上证50股指期权数据从哪里可以找到?

说起期权代码&#xff0c;其实期权代码是期权合约的唯一标识&#xff0c;通过代码可以准确地识别不同的期权合约&#xff0c;所以在期权交易中&#xff0c;了解期权代码是至关重要的一环。 上证50期权代码结构 上证50ETF期权代码由17位字符组成&#xff0c;例如“10002500C240…

设计模式 简单汇总

设计模式是软件工程中广泛使用的一套解决方案&#xff0c;用于解决常见问题并提高代码的质量。它们分为创建型、结构型和行为型三类&#xff0c;共23种模式。以下是各类别及其常见模式的详细说明&#xff1a; 目录 创建型模式结构型模式行为型模式 创建型模式 这些模式关注对象…

DeepSeek点燃AI大模型战火:编程语言争霸,谁将问鼎“终极武器”王座?

DeepSeek点燃AI大模型战火&#xff1a;编程语言争霸&#xff0c;谁将问鼎“终极武器”王座&#xff1f; 一、DeepSeek&#xff1a;AI大模型竞赛的“导火索” 2023年&#xff0c;中国AI公司深度求索&#xff08;DeepSeek&#xff09;发布DeepSeek-R1大模型&#xff0c;凭借其超…