【ONE·基础算法 || 字符串】

在这里插入图片描述

总言

  主要内容:编程题举例,熟悉理解字符串类题型。
  
  

文章目录

  • 总言
  • 1、字符串
  • 2、最长公共前缀(easy)
    • 2.1、题解
  • 3、最长回文子串 (medium)
    • 3.1、题解
  • 4、二进制求和(easy):高精度加法
    • 4.1、题解
  • 5、字符串相乘(medium):高精度乘法
    • 5.1、题解
  • Fin、共勉。

  
  
  
  

1、字符串

  主要在于熟悉字符串类的OJ题常用容器和接口。主要与其它算法结合使用。
  
  
  

2、最长公共前缀(easy)

  题源:链接。

在这里插入图片描述
  
  

2.1、题解

  1)、思路分析
  这里需要注意理解,一个字符串的前缀是从该字符串的第一个字符起始的一个子串
  方法一: 字符串两两比较,可以先找出前两个的最长公共前缀,然后拿这个最长公共前缀依次与后⾯的字符串比较,获取新的最长公共前缀,这样所有字符串比较完成,就能获取到最终结果。

在这里插入图片描述
  
  方法二: 统一比较所有字符串中 i 位置处的字符是否相同。何时结束比较?(遍历到某一字符串的尾部,或当前遍历字符与其它字符不相同,说明此前的字符均为公共前缀。)
在这里插入图片描述

  
  
  2)、题解
  字符串两两进行比较的写法:

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        //一个字符串的前缀是从该字符串的第一个字符起始的一个子串
        string ret = strs[0];//PS:数组中只有一个字符串,也满足条件(不进入循环,直接返回strs[0])。
        for(int i = 1; i < strs.size(); ++i)
        {
            ret = stringcompare(ret,strs[i]);
        }
        return ret;
    }

    //两字符串比较
    string stringcompare(string& s1, string& s2)
    {
        int i = 0;
        int len = min(s1.size(), s2.size());
        while(i < len && s1[i] == s2[i]) //当两字符串均存在,且当前位置元素相同时
            i++;
        return s1.substr(0,i);//string substr (size_t pos = 0, size_t len = npos) const;
    }
};

  
  字符串统一进行比较的写法:

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        
        string ref = strs[0];//以第一个字符串作为参照,后续字符串进行比较判断
        for(int i = 0; i < ref.size(); ++i)//遍历字符串strs[0],与其它字符串逐个比较i位置处的字符
        {
            for(int j = 1; j < strs.size(); ++j)//j表示第j个字符串,比较的是其第i个字符。
            {
                if(i > strs[j].size() || ref[i] != strs[j][i])//这里字符长度与字符元素都要进行判断
                    return ref.substr(0,i);
            }
        }
        return ref;
    }
};

  
  
  
  
  

3、最长回文子串 (medium)

  题源:链接。

在这里插入图片描述

  
  

3.1、题解

  1)、思路分析
  我们可以利用回文子串的性质。若一个字符串是回文串,从其中心位置开始向两边扩散,有左右两侧元素相等。
在这里插入图片描述
  以上是回文子串长度为奇数的情况,设当前遍历到的元素 i 为中心元素,则有left = i -1,right = i + 1,比较判断s[left]s[right],若符合则继续往两侧扩散寻找。
  此外,我们还需要考虑偶数情况。如下:可以让left = i; right = i + 1right = i; left = i - 1,依次往两边扩散比较。
  
在这里插入图片描述
  
  
  2)、题解
  整体可以套两层循环完成,外层用于遍历中心元素i,寻找每回合的回文子串,内层用于判断当前回合中,回文子串的扩散长度。

class Solution {
public:
    string longestPalindrome(string s) {
        int n = s.size();
        int begin = 0; // 用于记录最长数组的起始下标。
        int len = 0;   // 用于记录最长数组的长度。
        for (int i = 0; i < n; ++i) {

            // 以i为中点,向两边扩散
            // 以偶数扩展
            int left = i;
            int right = i + 1;
            while (left >= 0 && right <= n - 1 && s[left] == s[right]) {
                left--;
                right++;
            }

            if (right - left - 1 > len) {
                begin = left + 1;
                len = right - left - 1; // (right - 1) - (left + 1) + 1;
            }

            // 以奇数扩展
            left = i;
            right = i;
            while (left >= 0 && right <= n - 1 && s[left] == s[right]) {
                left--;
                right++;
            }

            if (right - left - 1 > len) {
                begin = left + 1;
                len = right - left - 1; // (right - 1) - (left + 1) + 1;
            }
        }
        return s.substr(begin, len);
    }
};

  
  
  
  
  
  
  

4、二进制求和(easy):高精度加法

  题源:链接。

在这里插入图片描述

  
  

4.1、题解

  1)、思路分析
  背景介绍: 此题实则为 高精度计算。高精度计算通常用于处理那些超出了标准数据类型(如 int, float, double 等)能够表示的范围或精度的数字。高精度计算通常涉及字符串或数组来表示大数字,并使用特殊的算法来进行加、减、乘、除等操作。
  
  
  题解: 类似这样的题,我们在链表的两数相加中也做过,这里运用的方法原理不变,模拟列竖式计算两个数之和的过程即可。需要注意:
  ①这里是二进制,因此两数相加时应该是逢二进一
  ②链表的题里直接给了我们逆序,方便了位数之间的运算,这里题目给我们的是正常顺序的字符串,在进行运算时需要对进位做处理。
  
  

  2)、题解
  以下为题解,总思想不变。但这里我们从字符串末尾开始往前运算。对于最终输出结果,可以先获取到一个逆序的字符串再逆置回来,或者直接使用头插获得正序的字符串。

class Solution {
public:
    string addBinary(string a, string b) {
        int sum = 0;//用于记录相位运算结果
        int cur1 = a.size()-1, cur2 =b.size()-1;//分别用于遍历两字符串(注意运算要从低位开始,这里是字符串尾位置)
        string ret;//用于记录返回结果
        while(cur1 >= 0 || cur2 >= 0 || sum)
        {
            if(cur1 >= 0)
                sum += a[cur1--] -'0';
            if(cur2 >= 0)
                sum += b[cur2--] -'0';

            ret += sum % 2 + '0';
            //ret.insert(0, 1, sum % 2 + '0');//若不用+=结合逆置,这里也可以用insert头插

            sum /= 2;
        }
        reverse(ret.begin(),ret.end());//字符串逆置
        return ret;
    }
};

  
  
  
  
  
  
  
  

5、字符串相乘(medium):高精度乘法

  题源:链接。

在这里插入图片描述  
  

5.1、题解

  1)、思路分析
  此题方法:无进位相乘然后相加,最后处理进位。
  整体思路就是模拟我们列竖式计算两个数相乘的过程。但是为了书写代码的方便性,可对其进行优化:在计算两数相乘的时候,先不考虑进位,等到所有结果计算完毕之后,再去考虑进位。 (所得结果和常规的列竖式计算相同)
在这里插入图片描述
  关于两数相乘的位数证明:相关链接。
  
  2)、题解
  

class Solution {
public:
    string multiply(string num1, string num2) {
        //先对字符串逆序
        reverse(num1.begin(), num1.end());
        reverse(num2.begin(), num2.end());
        int m = num1.size();
        int n = num2.size();
		
        vector<int> tmp(m + n -1);//用于存储无进位相乘后相加结果
        //无进位相乘相加
        for(int i = 0; i < n; ++i)
        {
            for(int j = 0; j < m; ++j)
            {
                tmp[j+i] += (num2[i] - '0')*(num1[j] - '0');//这里要注意相乘后结果应该放在哪位上。
            }
        }
        //处理结果(tmp数组,处理进位)
        int sum = 0; int i = 0;
        string ret;
        while(i < tmp.size() || sum)
        {
            if(i <tmp.size())
                sum += tmp[i++];
            ret += sum % 10 + '0';
            sum /= 10;
        }
        //处理前导零
        while(ret.size() > 1 && ret.back() == '0') ret.pop_back();
        //逆置返回
        reverse(ret.begin(), ret.end());
        return ret;
    }
};

  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  

Fin、共勉。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2.网络编程-HTTP和HTTPS

目录 HTTP介绍 HTTP协议主要组成部分 GET 和 POST有什么区别 常见的 HTTP 状态码有哪些 http状态码100 HTTP1.1 和 HTTP1.0 的区别有哪些 HTTPS 和 HTTP 的区别是什么 HTTP2 和 HTTP1.1 的区别是什么 HTTP3 和 HTTP2 的区别是什么 HTTPS的请求过程 对称加密和非对称…

armlinux裸机-uart

uart是一对一的串行异步全双工通信通信协议&#xff0c;串行速度较慢&#xff08;usart支持同步通信&#xff09; 传输原理 多个参数可以设置 为满足使用需求&#xff0c;我们一般都用带fifo缓冲中断。 我们使用S3C2440芯片&#xff0c;具体寄存器操作可以查看用户手册

积木报表Excel数据量大导出慢导不出问题、大量数据导不出问题优化方案和分析解决思路(优化前一万多导出失败,优化后支持百万级跨库表导出)

文章目录 积木报表Excel数据量大导出慢导不出问题、大量数据导不出问题优化方案和分析解决思路&#xff08;优化前一万多导出失败&#xff0c;优化后支持百万级跨库表导出&#xff09;优化结果需求背景和解决方案的思考解决方案流程描述&#xff1a;关键代码引入easy excel新建…

CentOS7.9.2009安装elasticsearch7.11.1(单节点)

本文章使用CentOS7.9.2009服务器安装elasticsearch7.11.1软件 1.服务器信息 [root@elasticsearch ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) [root@elasticsearch ~]# [root@elasticsearch ~]# cat /etc/hosts | grep elasticsearch 192.168.10.24…

如何理解图像处理领域的病态问题(ill-posed problem)

ill-posed problem&#xff0c;我们可以理解为病态问题或者不适定问题。在本文中&#xff0c;统一成为不适定问题。 在讨论不适定问题&#xff08;ill-posed problem&#xff09;之前&#xff0c;我们先来看一下什么叫适定性问题&#xff08;well-posed problem&#xff09;。…

14届蓝桥杯 C/C++ B组 T7 子串简写 (字符串)

采用存储目标字符下标的方法&#xff0c;此题的想法比较新奇&#xff0c;故予以记录。 存好下标之后&#xff0c;可以先定位好启始的字符&#xff0c;然后去搜结尾字符符合长度k并且最靠近启始字符的下标&#xff0c;找到之后可以直接取到这个下标之后的所有下标&#xff0c;因…

3d怎么在一块模型上开个孔---模大狮模型网

在进行3D建模时&#xff0c;有时候需要在模型上创建孔&#xff0c;以实现特定的设计需求或功能。无论是为了添加细节&#xff0c;还是为了实现功能性的要求&#xff0c;创建孔都是常见的操作之一。本文将介绍在3D模型上创建孔的几种常用方法&#xff0c;帮助您轻松实现这一目标…

免费全开源,功能强大的多连接数据库管理工具:DbGate

DbGate&#xff1a;您的全能数据库指挥中心&#xff0c;一站式免费开源解决方案&#xff0c;无缝连接并管理多款主流数据库&#xff0c;让复杂的数据世界变得轻松易控! - 精选真开源&#xff0c;释放新价值。 概览 DbGate 是跨平台的数据库管理器。支持 MySQL、PostgreSQL、SQ…

新零售SaaS架构:客户管理系统架构设计(万字图文总结)

什么是客户管理系统&#xff1f; 客户管理系统&#xff0c;也称为CRM&#xff08;Customer Relationship Management&#xff09;&#xff0c;主要目标是建立、发展和维护好客户关系。 CRM系统围绕客户全生命周期的管理&#xff0c;吸引和留存客户&#xff0c;实现缩短销售周…

chrome 浏览器 有自带的自动字幕功能,支持英文,控制您的音乐、视频等媒体内容

chrome 浏览器 有自带的自动字幕功能&#xff0c;支持英文&#xff0c;控制您的音乐、视频等媒体内容

Android Studio学习15——多页面情况下再看Activity生命周期

按返回键退出APP时&#xff1a; 走正常页面的退出流程&#xff1a;onPause–>onStop–>onDestroy(会Destroy,因为它从任务栈中退出了) 再点击图标回来时&#xff1a; 走正常页面的创建流程&#xff1a;onCreate–>onStart–>onResume 按Home键退出App时&#xff1a…

【C#】yield使用

&#x1f4bb;代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks;namespace ConsoleApp15 {internal class Program{static void Main(string[] args){IEnumerable<int&…

深度比较Vue 3.0中的computed和watch属性用法与最佳实践

摘要&#xff1a;在Vue 3.0中&#xff0c;computed和watch属性是用于处理数据逻辑的重要工具。本文将详细对比这两个属性的工作原理、适用场景以及使用时的注意事项&#xff0c;旨在帮助开发者更有效地选择和使用它们。 一、computed属性 computed属性是Vue 3.0中用于计算数据…

【小白学机器学习10】假设检验之1:F检验,F检验量的构造,F分布,F分布查表求P值等

目录 1 什么是F检验 F-test 1.1 F-test的定义 1.1.1 维基百科对F检验的定义 1.1.2 百度百科的定义 1.2 F检验的别名 1.3 F检验的判断手段 / 要达成的目标 / 适用范围 1.3.1 判断手段 1.3.2 对H0原假设的理解 1.3.3 判断目标/目的 1.3.4 适用的范围&#xff0c;场合 …

C++【组合模式】

简单介绍 组合模式是一种结构型设计模式&#xff0c; 只有在可以将对象拆分为【树状结构】的情况下使用。并且像使用独立对象一样使用它们。 常用于表示与图形打交道的用户界面组件或代码的层次结构。 基础理解 Q&#xff1a;为什么要用组合模式 &#xff1f; A&#xff1a;在…

每天学习一个Linux命令之curl

每天学习一个Linux命令之curl 在Linux系统中&#xff0c;有很多有用的命令可以帮助我们与网络进行交互。一个非常常用的命令是curl&#xff0c;它是一个功能强大的工具&#xff0c;可用于发送、接收和处理各种网络请求。本文将详细介绍在Linux下使用curl命令的各种选项及其用法…

011_C标准库函数之<time.h>

头文件<time.h>中说明了一些用于处理日期和时间的类型和函数。其中的一部分函数用于处理当地时间&#xff0c;因为时区等原因&#xff0c;当地时间与日历时间可能不相同。clock_t和time_t是两个用于表示时间的算术类型&#xff0c;而struct tm则用于存放日历时间的各个成…

QT学习day1

#include "mywidget.h"myWidget::myWidget(QWidget *parent): QWidget(parent) {this->resize(645,455);//设置窗口大小this->setWindowTitle("QQ");//设置窗口标题this->setWindowIcon(QIcon("D:\\QQ\\1579398717\\FileRecv\\pictrue\\qq.p…

Linux——线程互斥与互斥锁的使用

目录 前言 一、进程线程间的互斥相关背景概念 二、互斥量&#xff08;互斥锁&#xff09; 三、互斥锁的使用 1.互斥锁的初始化 2.加锁与解锁 3.锁的使用 4.锁的封装 四、线程饥饿 五、互斥锁的原理 六、死锁 前言 我们学习过线程概念与线程控制&#xff0c;知道了线…

Django项目定时任务django-crontab

首先定义一个定时任务函数tasks.py&#xff08;见文章末尾示例&#xff09;&#xff0c;编写函数&#xff0c;然后在setting.py中配置定时任务 1、首先安装django-crontab pip install django-crontab 2、在setting.py中添加应用 (在所有自定义注册app之上) INSTALLED_APPS …