字符串算法篇——字里乾坤,算法织梦,解构字符串的艺术(下)

news2025/4/11 19:32:34

文章目录

  • 前言
  • 第一章:最长公共前缀
    • 1.1 题目链接:https://leetcode.cn/problems/longest-common-prefix/description/
    • 1.2 题目分析:
    • 1.3 思路讲解:
    • 1.4 代码实现:
  • 第二章:最长回文子串
    • 2.1 题目链接:https://leetcode.cn/problems/longest-palindromic-substring/description/
    • 2.2 题目分析:
    • 2.3 思路讲解:
    • 2.4 代码实现:
  • 第三章:二进制求和
    • 3.1 题目链接:https://leetcode.cn/problems/add-binary/description/
    • 3.2 题目分析:
    • 3.3 思路讲解:
    • 3.4 代码实现:
  • 第四章:字符串乘法
    • 4.1 题目链接:https://leetcode.cn/problems/multiply-strings/description/
    • 4.2 题目分析:
    • 4.3 思路讲解:
    • 4.4 代码实现:
  • 尾声:字里行间的永恒智慧

在这里插入图片描述

前言

上篇我们介绍了常用的字符串及其相关原理应用,本篇将结合具体题目,进一步深化对于字符串算法的掌握运用。

第一章:最长公共前缀

1.1 题目链接:https://leetcode.cn/problems/longest-common-prefix/description/

1.2 题目分析:

  • 现给出字符串数组,要求返回所有字符串的最长公共前缀

1.3 思路讲解:

解法⼀(两两⽐较):
我们可以先找出前两个的最⻓公共前缀,然后拿这个最⻓公共前缀依次与后⾯的字符串⽐较,这样就可以找出所有字符串的最⻓公共前缀。\

解法⼆(统⼀⽐较):
题⽬要求多个字符串的公共前缀,我们可以逐位⽐较这些字符串,哪⼀位出现了不同,就在哪⼀位截⽌。

1.4 代码实现:

两两比较代码示例:

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) {
        //所有字符串一起 逐个比较
        string ret=strs[0];
        for(int i=0;i<ret.size();i++)
        {
            char temp=strs[0][i];
            for(int j=1;j<strs.size();j++)
            {
                
                if(i==strs[j].size()||temp!=strs[j][i])
                {
                    return ret.substr(0,i);
                }
            }
        }
        return ret;
        
    }
};

第二章:最长回文子串

2.1 题目链接:https://leetcode.cn/problems/longest-palindromic-substring/description/

2.2 题目分析:

题目要求找出字符串s中的最长回文子串,我们先来回顾一下什么是回文串

回文串:即正反形式相同的字符串,例如aba

2.3 思路讲解:

本题我们可以采用中心拓展算法

  • 对于⼀个⼦串⽽⾔,如果它是回⽂串,并且⻓度⼤于 2,那么将它⾸尾的两个字⺟去除之后,它仍然是个回⽂串。如此这样去除,⼀直除到⻓度⼩于等于 2 时呢?⻓度为 1 的,⾃⾝与⾃⾝就构成回⽂;⽽⻓度为 2 的,就要判断这两个字符是否相等了。
  • 从这个性质可以反推出来,从回⽂串的中⼼开始,往左读和往右读也是⼀样的。那么,是否可以枚举回⽂串的中⼼呢?
  • 从中⼼向两边扩展,如果两边的字⺟相同,我们就可以继续扩展;如果不同,我们就停⽌扩展。
  • 这样只需要⼀层 for 循环,我们就可以完成先前两层 for 循环的⼯作量。

2.4 代码实现:

class Solution {
public:
    string longestPalindrome(string s) {
        int n=s.size();
        int left=0,right=0,len=0,begin=0;
        for(int i=0;i<n;i++)
        {
            //奇数次拓展
            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.1 题目链接:https://leetcode.cn/problems/add-binary/description/

3.2 题目分析:

  • 题目给出两个只包含二进制数字的字符串,要求返回其按二进制运算规则相加的和
  • 该和用字符串表示

3.3 思路讲解:

模拟⼗进制中我们列竖式计算两个数之和的过程。但是这⾥是⼆进制的求和,我们不是逢⼗进⼀,⽽是逢⼆进⼀。

3.4 代码实现:

class Solution {
public:
    string addBinary(string a, string b) {
        int cur1=a.size()-1,cur2=b.size()-1;
        string ret="";//返回的字符串
        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;
        
    }
};

第四章:字符串乘法

4.1 题目链接:https://leetcode.cn/problems/multiply-strings/description/

4.2 题目分析:

  • 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
  • 观察字符串长度范围,首先排除正常乘法,因为其值大小远超long long所能表示的范围

4.3 思路讲解:

整体思路就是模拟我们⼩学列竖式计算两个数相乘的过程。但是为了我们书写代码的⽅便性,我们选择⼀种优化版本的,就是在计算两数相乘的时候,先不考虑进位,等到所有结果计算完毕之后,再去考虑进位。如下图:
在这里插入图片描述

4.4 代码实现:

class Solution {
public:
    string multiply(string num1, string num2) {
        int m=num1.size(),n=num2.size();
        string ret="";
        int len=m+n-1;
        reverse(num1.begin(),num1.end());
        reverse(num2.begin(),num2.end());//先逆序两个字符串
        //不进位的乘法
        vector<int> temp(len);
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                temp[i+j]+=(num1[i]-'0')*(num2[j]-'0');//此处注意是+=
            }
        }
        //处理进位
        int t=0,cur=0;
        while(cur<len||t)
        {
            if(cur<len)
            {
            t+=temp[cur++];
            }
            ret+=t%10+'0';
            t/=10;
        }
        //处理前导0
        while(ret.size()>1&&ret.back()=='0')
        {
            ret.pop_back();
        }
        reverse(ret.begin(),ret.end());
        return ret;
        
    }
};

尾声:字里行间的永恒智慧

字符串算法,如同文字的魔法,将字符编织成信息的纽带。从暴力匹配到前缀树,从压缩算法到加密技术,它展示了算法的艺术与科学的结合。在未来的旅程中,字符串算法将继续书写信息时代的传奇,为人类探索未知的语言和数据世界提供智慧的钥匙。

本篇关于字符串算法的介绍就暂告段落啦,希望能对大家的学习产生帮助,欢迎各位佬前来支持斧正!!!
在这里插入图片描述

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

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

相关文章

计算机网络 笔记 数据链路层3(局域网,广域网,网桥,交换机)

局域网: LAN:在某一区域内由多台计算机互联成的计算机组&#xff0c;使用广播信道 特点&#xff1a; 覆盖范围有限&#xff1a;通常局限在几千米范围内&#xff0c;比如一栋办公楼、一个校园或一个工厂等相对较小的地理区域。 数据传输速率高&#xff1a;一般能达到 10Mbps…

istio-proxy oom问题排查步骤

1. 查看cluster数量 cluster数量太多会导致istio-proxy占用比较大的内存&#xff0c;此时需检查是否dr资源的host设置有配置为* 2. 查看链路数据采样率 若采样率设置过高&#xff0c;在压测时需要很大的内存来维护链路数据。可以调低采样率或增大istio-proxy内存。 检查iop中…

fast-crud select下拉框 实现多选功能及下拉框数据动态获取(通过接口获取)

教程 fast-crud select示例配置需求:需求比较复杂 1. 下拉框选项需要通过后端接口获取 2. 实现多选功能 由于这个前端框架使用逻辑比较复杂我也是第一次使用,所以只记录核心问题 环境:vue3,typescript,fast-crud ,elementPlus 效果 代码 // crud.tsx文件(/.ts也行 js应…

Apache JMeter 压力测试使用说明

文章目录 一、 安装步骤步骤一 下载相关的包步骤二 安装 Jmeter步骤三 设置 Jmeter 工具语言类型为中文 二、使用工具2.1 创建测试任务步骤一 创建线程组步骤二 创建 HTTP 请求 2.2 配置 HTTP 默认参数添加 HTTP消息头管理器HTTP请求默认值 2.3 添加 查看结果监听器2.4 查看结果…

计算机网络 (40)域名系统DNS

前言 计算机网络域名系统DNS&#xff08;Domain Name System&#xff09;是互联网的基础技术之一&#xff0c;它负责将人类可读的域名转换为计算机用来通信的数字IP地址。 一、基本概念 DNS的主要目的是将域名解析或翻译为IP地址&#xff0c;使得用户可以通过简单易记的域名来访…

本地服务器Docker搭建个人云音乐平台Splayer并实现远程访问告别烦人广告

前言 大家好&#xff01;今天我要给大家分享的是如何在Ubuntu上用Docker快速搭建高颜值无广告的某抑云音乐播放器Splayer的详细流程&#xff0c;并且结合cpolar内网穿透工具实现远程访问。如果你是音乐爱好者&#xff0c;经常需要在外办公或旅行&#xff0c;这个教程绝对能让你…

黑马linux入门笔记(01)初始Linux Linux基础命令 用户和权限 实用操作

B站 黑马程序员 的视频 BV1n84y1i7td 黑马程序员新版Linux零基础快速入门到精通&#xff0c;全涵盖linux系统知识、常用软件环境部署、Shell脚本、云平台实践、大数据集群项目实战等 增强自控力 冥想慢呼吸绿色锻炼充分休息减少决策次数优先做重要的事情(早晨)融入强自控群控…

小程序组件 —— 31 事件系统 - 事件绑定和事件对象

小程序中绑定事件和网页开发中绑定事件几乎一致&#xff0c;只不过在小程序不能通过 on 的方式绑定事件&#xff0c;也没有 click 等事件&#xff0c;小程序中绑定事件使用 bind 方法&#xff0c;click 事件也需要使用 tap 事件来进行代替&#xff0c;绑定事件的方式有两种&…

UE5 使用内置组件进行网格切割

UE引擎非常强大&#xff0c;直接内置了网格切割功能并封装为蓝图节点&#xff0c;这项功能在UE4中就存在&#xff0c;并且无需使用Chaos等模块。那么就来学习下如何使用内置组件实现网格切割。 1.配置测试用StaticMesh 对于被切割的模型&#xff0c;需要配置一些参数。以UE5…

ue5 1.平A,两段连击蒙太奇。鼠标点一下,就放2段动画。2,动画混合即融合,边跑边挥剑,3,动画通知,动画到某一帧,把控制权交给蓝图。就执行蓝图节点

新建文件夹 创建一个蒙太奇MA_Melee 找到c_slow 调节一下速度 把D_slow拖上去 中间加一个片段 哎呀呀&#xff0c;写错了&#xff0c;我想写2 把这个标记拖过来&#xff0c;点击默认default 弄第二个片段 就会自己变成这个样子 把2这个标记拖到中间 鼠标左键&a…

《机器学习》之K-means聚类

目录 一、简介 二、K-means聚类实现步骤 1、初始化数据点、确定K值 2、通过距离分配数据点 3、更新簇中心 4、 迭代更新 三、聚类效果评价方式 1、轮廓系数的定义 2、整体轮廓系数 3、使用场景 4、优点 5、缺点 6、代码实现方法 四、K-means聚类代码实现 1、API接…

Wireshark抓包教程(2024最新版个人笔记)

改内容是个人的学习笔记 Wireshark抓包教程&#xff08;2024最新版&#xff09;_哔哩哔哩_bilibili 该课程笔记1-16 wireshark基础 什么是抓包工具&#xff1a;用来抓取数据包的一个软件 wireshark的功能&#xff1a;用来网络故障排查&#xff1b;用来学习网络技术 wireshark下…

Web开发(一)HTML5

Web开发&#xff08;一&#xff09;HTML5 写在前面 参考黑马程序员前端Web教程做的笔记&#xff0c;主要是想后面自己搭建网页玩。 这部分是前端HTML5CSS3移动web视频教程的HTML5部分。主要涉及到HTML的基础语法。 HTML基础 标签定义 HTML定义 HTML(HyperText Markup Lan…

RabbitMQ 的工作模式

目录 工作模式 Simple&#xff08;简单模式&#xff09; Work Queue&#xff08;工作队列&#xff09; Publish/Subscribe&#xff08;发布/订阅&#xff09; Exchange&#xff08;交换机&#xff09; Routing&#xff08;路由模式&#xff09; Topics&#xff08;通配…

备战蓝桥杯:树的存储与遍历(dfs和bfs)

树的概念 树的逻辑结构是树形结构&#xff0c;和我们之前的线性结构又不太一样了&#xff0c;是一种一对多的关系 树的结点分为根节点&#xff0c;叶子结点&#xff08;没有分支的结点&#xff09; 以及分支结点 从上往下看&#xff0c;每个结点都有0个或多个后继 从下往上…

超大规模分类(三):KNN softmax

传统的分类损失计算输入数据和每个类别中心的距离&#xff0c;来优化模型的训练。KNN softmax通过选择和输入数据最相关的top-K个类别&#xff0c;仅计算输入数据和top-K个类别中心的距离&#xff0c;以减小计算量。 KNN softmax首次诞生于达摩院机器智能技术实验室发表的SIGKD…

ubuntu官方软件包网站 字体设置

在https://ubuntu.pkgs.org/22.04/ubuntu-universe-amd64/xl2tpd_1.3.16-1_amd64.deb.html搜索找到需要的软件后&#xff0c;点击&#xff0c;下滑&#xff0c; 即可在Links和Download找到相关链接&#xff0c;下载即可&#xff0c; 但是找不到ros的安装包&#xff0c; 字体设…

项目实战——使用python脚本完成指定OTA或者其他功能的自动化断电上电测试

前言 在嵌入式设备的OTA场景测试和其他断电上电测试过程中&#xff0c;有的场景发生在夜晚或者随时可能发生&#xff0c;这个时候不可能24h人工盯着&#xff0c;需要自动化抓取串口日志处罚断电上电操作。 下面的python脚本可以实现自动抓取串口指定关键词&#xff0c;然后触发…

电脑分辨率调到为多少最佳?电脑分辨率最佳设置

电脑分辨率是指电脑屏幕上显示的像素点的数量&#xff0c;通常用水平和垂直方向的像素点数来表示&#xff0c;例如19201080。像素点越多&#xff0c;显示的内容就越清晰&#xff0c;但也会占用更多的系统资源和电力。那么多电脑分辨率多少最佳&#xff1f;以及电脑分辨率如何调…

代码随想录算法【Day20】

Day20 二叉搜索树 235. 二叉搜索树的最近公共祖先 理解只要当前节点的值在p和q节点的值的中间&#xff0c;那这个值就是最近的公共祖先&#xff0c;绝对不是次近的&#xff0c;这个题就好做了。 递归法 二叉搜索树本身是有序的&#xff0c;所以不涉及到前中后序的遍历 cl…