【基础算法总结】字符串篇

目录

  • 一,算法简介
  • 二,算法原理和代码实现
    • 14.最长公共前缀
    • 5.最长回文子串
    • 67.二进制求和
    • 43.字符串相乘
  • 三,算法总结

一,算法简介

字符串 string 是一种数据结构,它一般和其他的算法结合在一起操作,比如和模拟,高精度加减,双指针,动态规划等算法结合,所以有关字符串类的题型是多种多样的。通过本篇文章挑选的一些题目来熟悉有关字符串接口的使用

二,算法原理和代码实现

14.最长公共前缀

在这里插入图片描述
在这里插入图片描述

算法原理:
这道题的本质是模拟,一般有以下两种模拟方法

解法1:两两字符串比较
可以封装一个函数用来找出两个字符串的最长公共前缀。固定一个字符串,用另一个字符串的每个字符和固定字符串的每个字符进行比较,保存相同的字符,直到其中一个字符串截止或是字符不相等,最后返回保存的字符串即可。
在这里插入图片描述
假设有 n 个字符串,每个字符串的平均长度为 m,则时间复杂度是 O(n*m)

代码实现:

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){string tmp = "";// 比较两两字符串的每个字符,返回相同的部分。直到一个结束或不相等int n = min(s1.size(), s2.size());for(int i = 0; i < n; i++)if(s1[i] == s2[i]) tmp += s1[i];else break;return tmp;}
};

解法2:统一比较
把每个字符串从头开始每个字符同时比较,保存相同字符(或是保存对应的下标,获取结果时直接截取),直到有一个字符串遍历结束或是字符不相等
在这里插入图片描述
假设有 n 个字符串,每个字符串的平均长度为 m,则时间复杂度也是 O(n*m)。

细节问题:

这里有一个选谁作为参考的问题:
我们可以选第一个字符串作为参考。第一层循环的结束条件用第一个字符串的长度,第二层循环比较字符是否相等时也用第一个字符串的每个字符作参考,如果某一个长度越界了或是字符不相同了就截取

代码实现:

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];}
};

5.最长回文子串

在这里插入图片描述

算法原理:

解法:中心拓展算法
中心拓展算法的本质是使用双指针进行暴力枚举,只不过是根据回文子串的特性枚举的
算法流程:
(1) 遍历字符串,依次固定每一个字符作为中心 i
(2) 从中心点开始,使用双指针 left 和 right,当两者不越界并且两个字符相等时,同时向两边扩展

细节问题:

奇数长度和偶数长度都需要考虑
先定义变量 begin 为回文串的起始长度,len 为回文串的长度
(1) 奇数长度的扩展
定义 left 和 right 作为回文子串边界的下一个位置,left = right = i,若 left 和 right 不越界,且s[left] == s[right],则 left–,right++
当跳出循环,且left 和 right之间的长度 > len 时,就要更新 begin 和 len
(2) 偶数长度的扩展
让 left = i,right = i + 1,其他的与奇数长度的扩展一致

代码实现:

class Solution 
{
public:string longestPalindrome(string s) {int n = s.size();int begin = 0, len = 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){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);}
};

67.二进制求和

在这里插入图片描述

算法原理:

本题是一个二进制的高精度加法模拟题,本质是模拟加法的列竖式运算。
在这里插入图片描述

代码实现:

class Solution 
{
public:string addBinary(string a, string b) {int i = a.size() - 1, j = b.size() - 1, t = 0;string ret = "";while(i >= 0 || j >= 0 || t){if(i >= 0) t += (a[i--] - '0');if(j >= 0) t += (b[j--] - '0');ret += (t % 2 + '0');t /= 2;}reverse(ret.begin(), ret.end());return ret;}
};

43.字符串相乘

在这里插入图片描述
在这里插入图片描述

算法原理:
本题是一道高精度乘法的模拟题

解法1:模拟竖式乘法运算
先把两个字符串逆序,固定一个字符,遍历另一个与它相乘。思路很好想,但是代码不好写,有很多细节
细节问题:
(1) 高位相乘的时候要补"0"
(2) 处理前导0
在这里插入图片描述
(3) 注意最后结果的逆序

解法2:对解法1做优化,先无进位相乘再相加,最后处理进位
这个解法的核心是要借助一个辅助数组。假设两个字符串的长度是m,n,则创建一个大小为 m+n-1的数组,再用两层for循环模拟竖式乘法计算出每一个相乘的值,把每个值都扔进数组中的对应位置,并且把每次相乘的值和原来对应位置的值相加,最后再处理进位

图解1如下

在这里插入图片描述
在这里插入图片描述

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

代码实现:

class Solution 
{
public:string multiply(string num1, string num2) {// 准备工作int n = num1.size(), m = num2.size();vector<int> add(n+m-1);reverse(num1.begin(), num1.end());reverse(num2.begin(), num2.end());// 无进位相乘再相加,放入数组的对应位置for(int i = 0; i < n; i++)for(int j = 0; j < m; j++)add[i+j] += ((num1[i] - '0') * (num2[j] - '0'));// 处理进位,把数组里的值相加int t = 0, i = 0;string ret = "";while(i < n+m-1 || t){if(i < n+m-1) t += add[i++];ret += to_string(t % 10);t /= 10;}// 处理前导0reverse(ret.begin(), ret.end());if(ret[0] == '0') return "0";return ret;}
};

三,算法总结

字符串类型的算法题型是多种多样的,并且也可以使用多种字符串函数接口了解决问题。

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

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

相关文章

远程控制软件推荐:亲测好用!

无论是在家办公、技术支持还是远程协助家人&#xff0c;一个好的远程控制工具都能让我们的工作更加高效。下面&#xff0c;我将分享我对几款流行的远程控制软件的个人体验&#xff0c;并给出我的推荐。 向日葵远程控制 直达链接&#xff1a;down.oray.com 向日葵远程控制是…

如何实现一个基于 HTML+CSS+JS 的任务进度条

如何实现一个基于 HTMLCSSJS 的任务进度条 在网页开发中&#xff0c;任务进度条是一种常见的 UI 组件&#xff0c;它可以直观地展示任务的完成情况。本文将向你展示如何使用 HTML CSS JavaScript 来创建一个简单的、交互式的任务进度条。用户可以通过点击进度条的任意位置来…

Spring Boot读取resources目录下文件(打成jar可用),并放入Guava缓存

1、文件所在位置&#xff1a; 2、需要Guava依赖&#xff1a; <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>23.0</version></dependency>3、启动时就读取放入缓存的代码&#xf…

10.8作业

优化登录框&#xff1a; 当用户点击取消按钮&#xff0c;弹出问题对话框&#xff0c;询问是否要确定退出登录&#xff0c;并提供两个按钮&#xff0c;yes|No&#xff0c;如果用户点击的Yes&#xff0c;则关闭对话框&#xff0c;如果用户点击的No&#xff0c;则继续登录 当用户点…

26.删除有序数组中的重复项

题目::26. 删除有序数组中的重复项 - 力扣&#xff08;LeetCode&#xff09; 思路:只要不和前面的数一样就可以移动指针&#xff0c;进行赋值 代码: class Solution { public:int removeDuplicates(vector<int>& nums) {int slow 0 ;for(int fast 1; fast < …

Sharding-JDBC笔记04-分库分表实战

文章目录 前言一、需求描述二、数据库设计三、环境说明四、环境准备4.1.mysql主从同步(windows)4.2.初始化数据库 五、实现步骤5.1 搭建maven工程引入maven依赖 5.2 实体类5.3 dao层5.4 服务类5.5 测试类总结 5.6 查询商品DaoService单元测试输出小结 5.7 统计商品Dao单元测试统…

许昌文旅助手:AI智能体在文旅领域的创新应用

哈哈&#xff0c;大家好&#xff0c;我是王帅旭&#xff0c;来自大禹智库&#xff0c;也是《实战AI智能体》一书的作者。今天&#xff0c;咱们就来聊聊一个超级有趣的案例——许昌文旅助手&#xff0c;看看AI智能体是如何在文旅领域大放异彩的&#xff01; 无限拓展的能力集&am…

10.8QTQMessageBox练习

QQ界面 widget.cpp #include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {//设置框体的大小和颜色this->setFixedSize(350,500);this->setStyleSheet("background-color:#e5f0ff;");//创建一个LineEdit edit1edit1 new QLineEdi…

面试淘天集团大模型算法工程师, 开心到飞起!!!

应聘岗位&#xff1a;淘天集团-大模型算法工程师 面试轮数&#xff1a; 整体面试感觉&#xff1a; 1. 自我介绍 在自我介绍环节&#xff0c;我清晰地阐述了个人基本信息、教育背景、工作经历和技能特长&#xff0c;展示了自信和沟通能力。 2. 技术问题 2.1 在大模型微调过程…

全网最详细的Python Locust性能测试框架实践

Locust的介绍 Locust是一个python的性能测试工具&#xff0c;你可以通过写python脚本的方式来对web接口进行负载测试。 Locust的安装 首先你要安装python2.6以上版本&#xff0c;而且有pip工具。之后打开命令行&#xff0c;分别安装locustio和pyzmq&#xff08;命令如下&…

【技术白皮书】内功心法 | 第一部分 | 数据结构与算法基础(数据结构)

数据结构与算法基础 内容简介数据结构数据模型数据结构的表现形式 基本概念数据&#xff08;Data&#xff09;数据元素&#xff08;data element&#xff09;数据结构的定义物理结构和逻辑结构逻辑结构逻辑结构表现形式二元组模型集合结构模型线性结构模型树结构模型图结构模型…

GNURadio 平台实现AM信号调制解调实验

文章目录​​ 一、AM调制解调原理 1.调制原理 2.解调原理 二、搭建的GRC流图 1.AM调制信号流图 2.AM解调信号流图 一、AM调制解调原理 1.调制原理 幅度调制&#xff08; Amplitude modulation——AM&#xff09; &#xff0c; 是常规的双边带调制&#xff0c; 即使载波的…

和鲸科技创始人范向伟:拐点即将来临,AI产业当前的三个瓶颈

在科技迅猛发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;无疑已经成为引领新一轮产业革命的核心动力之一。全球企业纷纷拥抱AI技术&#xff0c;试图借助其变革力量在竞争中突围&#xff0c;然而业界对AI产业化的拐点何时来临却众说纷纭。毕竟AI技术从实验室到商业…

[SAP ABAP] INCLUDE程序创建

在ABAP中&#xff0c;INCLUDE是一种结构化编程技术&#xff0c;它允许将一段程序代码片段包含到其他程序段中&#xff0c;以便复用和维护 INCLUDE程序创建的好处 ① 代码模块化 将常用的功能或通用的子程序存放到单独的文件中&#xff0c;使得主程序更简洁、易于理解和管理 ② …

揭秘人工智能的奇幻构造:人工智能的组成及都涉及什么

作者简介&#xff1a;我是团团儿&#xff0c;是一名专注于云计算领域的专业创作者&#xff0c;感谢大家的关注 座右铭&#xff1a; 云端筑梦&#xff0c;数据为翼&#xff0c;探索无限可能&#xff0c;引领云计算新纪元 个人主页&#xff1a;团儿.-CSDN博客 目录 前言&#…

动态内存管理练习题的反汇编代码分析(底层)

1.C语言代码 #include <stdio.h> char* GetMemory(void) {char p[] "hello world";return p; }void Test(void) {char* str NULL;str GetMemory();printf(str); }int main() {Test();return 0; } 2.反汇编代码 VS2022x64debug #include <stdio.h>…

PCB进程初识

目录 一、什么是进程 1.课本概念 2.内核观点 二、进程的描述-PCB 1.什么是PCB 2.PCB的组织方式 3.task_struct是Linux操作系统下的PCB 4.task_struct内容分类 三、进程的查看 四、进程的创建 1.查看子进程id和父进程id 演示实例1&#xff1a; 2.fork初识 演示实例…

软件测试学习笔记丨Mitmproxy使用

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/32334 一、简介 Mitmproxy是一款开源、免费的代理工具&#xff0c;支持Mac、Windows、Linux。相比其他代理工具&#xff0c;可以通过Python和Mitmproxy工具本身的插件机制&#xff0c;实现通…

npm运行时出现npm ERR! builtins is not a function报错

项目场景&#xff1a; 项目运行时什么都没动都没改突然运行不起来了&#xff0c;报错 TypeError: builtins is not a function 代码什么都没动&#xff0c;不是代码问题&#xff0c;排查后只有可能是node和npm的问题&#xff0c;所以卸载掉node重装重启 解决方案&#xff1a; …

Hierarchical Cross-Modal Agent for Robotics Vision-and-Language Navigation

题目&#xff1a;用于视觉语言导航的层次化跨模态智能体 摘要 1. 问题背景和现有方法 VLN任务&#xff1a;这是一种复杂的任务&#xff0c;要求智能体基于视觉输入和自然语言指令进行导航。 现有方法的局限性&#xff1a;之前的工作大多将这个问题表示为离散的导航图&#x…