算法——字符串

news2024/11/26 17:33:48

这里结合的是之前一些算法,比如模拟、KMP等,题型比较丰富

最长公共前缀

最长公共前缀

题目解析

  • 查找字符串数组中的最长公共前缀。
  • 如果不存在公共前缀,返回空字符串 “”

算法原理

解法一:两两比较:定义一个指针i,扫描字符串,当字符串对应位置相同时,移动道下一个位置,直到其中一个字符串到头或者两者对应位置字符不同,结束循环。时间复杂度O(m*n) m为每个字符平均长度,n为字符串个数
image.png

解法二:统一比较
一次比较一竖列,当一竖列都相等时,将他存储到ret里,ret是最终返回的字符串。在比较的时候我们可以那第一个字符串作为标准,例如当比较i位置的时候,拿第一个字符串第i位置的字符作比较,然后拿着该字符和他这一列一一作比较。所以在第一个for循环里,i<第一个字符串的长度即可,当然有些情况需要特判,比如说第一个字符判断到e时,那会发现第二个字符长度不够(这里只是举例子说明,他到不了e就可以停止),即越界,那我们就停止。
j是用来遍历一个一个字符串,从下标1位置开始。是拿j位置的第i个字符和我们刚刚的tmp作比较(tmp是作为基准元素,接下来的j是与第一行第i位置做比较的)如果第j行第i个位置不和tmp位置相等时,说明0~i-1这个位置时最长的公共前缀。image.png

代码实现

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

最长回文子串

最长回文子串

题目解析

  • 给你一个字符串 s,找到 s 中最长的回文子串。
  • 如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。

算法原理

这里我们用中心扩展算法解决:其实本质上还是暴力枚举,只不过我们借助了回文的特性来解决。以i位置为中心,看两边能扩展到什么位置。在中间位置时创建两个指针,分别向两边移动,当两个指针所指的元素相同时,向两边移动,当不相同或者越界时,停止移动,那么两个指针之间的就是最长回文串。但是我们这样枚举出的子串会永远是奇数长度,我们还要考虑偶数长度的情况。所以我们在代码编写的时候,先让left==right,来一次奇数级别的移动,再来一次循环来偶数级别的。image.png
image.png

代码实现

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)  //left和right之间的长度
        {
            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);
    }
};

二进制求和

二进制求和

题目解析

背后是经典的高精度加法(正常数据类型是存不下的,数字非常大),算法思想是模拟。

  • 给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和

算法原理

解法:模拟列竖式运算
用t来模拟两数二进制相加,将其初始化为0,模2进1。从最低位开始加image.png

代码实现

class Solution 
{
public:
    string addBinary(string a, string b) 
    {
        string ret;
        int cur1 = a.size() - 1, cur2 = b.size() - 1, 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;
    }
};

字符串相乘

字符串相乘

题目解析

字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
**注意:**不能使用任何内置的 BigInteger 库或直接将输入转换为整数。 因为这里乘积过后数字很大,就算是double类型也会溢出,所以用字符串形式返回

算法原理

  1. 解法:模拟小学的列竖式运算

还是用ret存储,然后拿其中一位去乘上面的字符串数字,用tmp记录,然后累加到ret中。即分别将738、615、492分别存储到tmp上,然后再加入ret中
image.png

  1. 细节一:注意高位相乘时,要补上0,这里相加时,是738+6150而不是615.——解决办法:最好是将原字符串逆序。因为我么做运算时,是从最低位开始计算。当我们拿5去和上面数字相乘,此时5的下标位1,正好需要补一个0,同理4的下标位2,补两个0.最终我们放入tmp的结果是逆序的,累加到ret中,最后再逆序一次就得到我们最终求的结果

image.png

  1. 细节二:处理前导0:0去乘1 2 3时分别得到三个0,我们需要把前面两位去掉

image.png

  1. **细节三:注意计算结果的顺序 **返回结果需要再逆序

  1. 解法二:优化 ——无进位相乘然后相加最后处理进位

先不处理进位情况。相加完之后再处理进位情况。
image.png

创建一个长度为m+n-1的数组,让下面的数去乘上面的数,判断放在哪个位置时,就让两个数字下标相加即可。比如用6去乘3,即都是0位置上,最终18就放在数组0下标的位置上。
image.png

最终处理进位时,就相当于让tmp里的数再和0相加放入ret里就行。最后的最后处理前导0.image.png

代码实现

class Solution 
{
public:
    string multiply(string num1, string num2) 
    {
// 解法:⽆进位相乘后相加,然后处理进位
    int m = num1.size(), n = num2.size();
    reverse(num1.begin(), num1.end());
    reverse(num2.begin(), num2.end());
    vector<int> tmp(m + n - 1);

// 1. ⽆进位相乘后相加
    for(int i = 0; i < m; i++)
    for(int j = 0; j < n; j++)
    tmp[i + j] += (num1[i] - '0') * (num2[j] - '0');

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

// 3. 处理前导零
    while(ret.size() > 1 && ret.back() == '0') ret.pop_back();
    reverse(ret.begin(), ret.end());
    return ret;
    }
};

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

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

相关文章

基于图论的图像分割 python + PyQt5

数据结构大作业&#xff0c;基于图论中的最小生成树的图像分割。一个很古老的算法&#xff0c;精度远远不如深度学习算法&#xff0c;但是对于代码能力是一个很好的锻炼。 课设要求&#xff1a; &#xff08; 1 &#xff09;输入&#xff1a;图像&#xff08;例如教室场景图&a…

poi操作Excel给列设置下拉菜单(数据验证)

效果图&#xff1a; pom.xml文件增加依赖&#xff1a; <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.0.1</version></dependency> 12345Workbook实现类有三个&#xff1a;HSSFWork…

Python算法例33 删除数字

1. 问题描述 给出一个字符串A&#xff0c;表示一个n位的正整数&#xff0c;删除其中k位数字&#xff0c;使得剩余的数字仍然按照原来的顺序排列产生一个新的正整数&#xff0c;本例将找到删除k个数字之后的最小正整数&#xff0c;其中n≤240&#xff0c;k≤n。 2. 问题示例 …

计算机专业个人简历范文(8篇)

HR浏览一份简历也就25秒左右&#xff0c;如果你连「好简历」都没有&#xff0c;怎么能找到好工作呢&#xff1f; 如果你不懂得如何在简历上展示自己&#xff0c;或者觉得怎么改简历都不出彩&#xff0c;那请你一定仔细读完。 互联网运营个人简历范文> 男 22 本科 AI简历…

测试开发工具推荐(含自动化、性能、稳定性、抓包)

今天将给大家推荐14款日常工作中经常用到的测试开发工具神器&#xff0c;涵盖了自动化测试、APP性能测试、稳定性测试、抓包工具等。 一、UI自动化测试工具 1. uiautomator2 Github地址 https://github.com/openatx/uiautomator2 介绍&#xff1a; openatx开源的ui自动化…

k8s陈述式资源管理(命令行)

1、资源管理 &#xff08;1&#xff09;陈述式资源管理&#xff08;常用——查、增&#xff09; 使用kubectl工具进行命令行管理 ①特点&#xff1a;对资源的增删查比较方便&#xff0c;对改不友好 ②优点&#xff1a;90%以上的场景都可以满足 ③缺点&#xff1a;命令冗长…

小白入门java基础-注解

一&#xff1a;介绍 Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的高级程序设计语言。 Java 可运行于多个平台&#xff0c;如 Windows, Mac OS 及其他多种 UNIX 版本的系统。Java语言编写的程序&#xff0c;在一次编译后&#xff0c;可以在多个系统平台上运行。 主…

Vue 插槽:让你的组件更具扩展性(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

听GPT 讲Rust源代码--library/proc_macro

File: rust/library/proc_macro/src/bridge/rpc.rs 在Rust源代码中&#xff0c;rust/library/proc_macro/src/bridge/rpc.rs文件的作用是实现了Rust编程语言的编译过程中的远程过程调用&#xff08;RPC&#xff09;机制。 这个文件定义了与编译器的交互过程中使用的各种数据结构…

CGAL的空间排序

1、介绍 许多在CGAL中实现的几何算法都是增量的&#xff0c;因此它们的速度取决于插入顺序。此软件包提供了排序算法&#xff0c;可以大大提高此类算法的运行时间。 其基本原理是沿着空间填充曲线对对象进行排序&#xff0c;这样在插入顺序上&#xff0c;几何上接近的两个对象将…

Seata服务搭建与模式实现

日升时奋斗&#xff0c;日落时自省 目录 1、简述 2、Seata优越性 3、Seata组成 4、Seata模式 4.1、XA 模式 4.2、AT 模式(默认模式) 4.3、TCC 模式 4.4、SAGA 模式 4.5、XA协议 5、Seata服务部署 5.1、文件数据源部署 5.1.1、下载并安装Seata 5.1.2、启动Seata服…

oracle 9i10g编程艺术-读书笔记2

配置Statspack 安装Statspack需要用internal身份登陆&#xff0c;或者拥有SYSDBA(connect / as sysdba)权限的用户登陆。需要在本地安装或者通过telnet登陆到服务器。 select instance_name,host_name,version,startup_time from v$instance;检查数据文件路径及磁盘空间&…

springboot基于Java的小区物业管理系统设计与实现

springboot基于Java的小区物业管理系统设计与实现 源码获取&#xff1a; https://docs.qq.com/doc/DUXdsVlhIdVlsemdX

Couchdb 垂直权限绕过漏洞(CVE-2017-12635)

一、漏洞描述 Apache CouchDB是一个开源数据库&#xff0c;专注于易用性和成为”完全拥抱web的数据库”。它是一个使用JSON作为存储格式&#xff0c;JavaScript作为查询语言&#xff0c;MapReduce和HTTP作为API的NoSQL数据库。应用广泛&#xff0c;如BBC用在其动态内容展示平台…

常见网络设备及功能详解

网络设备 - 交换机 交换机&#xff1a;距离终端用户最近的设备&#xff0c;用于终端用户接入网络、对数据帧进行交换等。 交换机的功能&#xff1a; 终端设备&#xff08;PC、服务器等&#xff09;的网络接入二层交换&#xff08;Layer 2 Switching&#xff09; 网络设备 - …

ctf_show(web入门笔记)持续更新中

信息收集 1-2&#xff1a;查看源代码 3&#xff1a;bp抓包 4&#xff1a;robots.txt&#xff08;这个文件里会写有网站管理者不想让爬虫的页面或其他&#xff09; 5&#xff1a;网站源代码泄露index.phps 6&#xff1a;同样也是源码泄露&#xff0c;&#xff08;拿到以后还…

redis 从0到1完整学习 (十四):RedisObject 之 ZSet 类型

文章目录 1. 引言2. redis 源码下载3. redisObject 管理 ZSet 类型的数据结构4. 参考 1. 引言 前情提要&#xff1a; 《redis 从0到1完整学习 &#xff08;一&#xff09;&#xff1a;安装&初识 redis》 《redis 从0到1完整学习 &#xff08;二&#xff09;&#xff1a;re…

windows和linux操作Git(序章2)

Git 分布式版本控制系统(序章1) ## Linux 下安装 Git&#x1f53a; ​ ## Git命令大全&#x1f53a; windows和linux通用 安装完 Git 后&#xff0c;需要进行配置&#xff0c;如姓名、Email 等 git config --global user.name "你的名字"git config --global us…

CSS 纵向底部往上动画

<template><div class"container" mouseenter"startAnimation" mouseleave"stopAnimation"><!-- 旋方块 --><div class"box" :class"{ scale-up-ver-bottom: isAnimating }"><!-- 元素内容 --&g…

Nginx 反向代理负载均衡

Nginx 反向代理负载均衡 普通的负载均衡软件&#xff0c;如 LVS&#xff0c;其实现的功能只是对请求数据包的转发、传递&#xff0c;从负载均衡下的节点服务器来看&#xff0c;接收到的请求还是来自访问负载均衡器的客户端的真实用户&#xff1b;而反向代理就不一样了&#xf…