【算法】算法(模拟、指针等)解决字符串类题目(C++)

文章目录

  • 1. 前言
  • 2. 解决 字符串类算法题
    • 14.最长公共前缀
    • 5.最长回文子串
    • 67.二进制求和
    • 43.字符串相乘

1. 前言

字符串题目有很多种,这里筛选几个考察模拟、双指针等的题目,并用相关算法解决。

2. 解决 字符串类算法题

14.最长公共前缀

在这里插入图片描述

思路

  • 题意分析:题目要求找到字符串数组中的最长公共前缀。
  • 解法一两两比较
    • 遍历数组,每次比较后更新最长公共前缀,并循环比较找最长公共前缀
  • 解法二统一比较
    • 遍历第一个字符串的所有字符,将当前字符与其他字符串相同位置的字符进行比较。
    • 如果发现不匹配的字符或某个字符串已经达到最终长度(即没有更多字符可比较),则返回第一个字符串的前缀子串

代码

  • 解法一:
class Solution {
public:string longestCommonPrefix(vector<string>& strs) {string ret = strs[0];// 解法一:两两比较,找公共前缀for(int i = 0; i < strs.size(); i++){ret = findCommonPrefix(ret, strs[i]);}return ret;}string findCommonPrefix(string &s1, string& s2) {// 找公共前缀string tmp = "";for(int i = 0; i < min(s1.size(), s2.size()); ++i){if(s1[i] == s2[i])tmp += s1[i];elsebreak;}return tmp;}
};
  • 解法二:
class Solution {
public:string longestCommonPrefix(vector<string>& strs) {// 解法二:统一比较for(int i = 0; i < strs[0].size(); ++i) // 遍历第一个字符串的所有字符{char tmp = strs[0][i]; // tmp与其他字符比较for(int j = 0; j < strs.size(); ++j){if(tmp != strs[j][i] || i == strs[j].size()) // 如果字符不匹配or有字符串最终长度截止到当前位置   return strs[0].substr(0, i);}}return strs[0];}
};

5.最长回文子串

在这里插入图片描述

思路

在这里插入图片描述

  • 解法中心扩展算法
    • 如图所示,我们遍历数组,依次固定数组每一位,通过左右两指针找最长回文串。
  • 细节注意
    • 奇数长的回文串与偶数长的回文串计算时,两指针起始位置不同,所以我们分别进行计算。 在这里插入图片描述

代码

string longestPalindrome(string s) {// 遍历每一位,双指针按从左右方向移动,并比较int len = 0, n = s.size(), begin = 0; // begin存储最长子串的开始位置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) // 如果此时回文串长度>len,更新结果{len = right - left - 1;begin = left + 1;}// 进行偶数长回文串的判定left = i, right = i + 1;while(left >= 0 && right <= n && s[left] == s[right]) // 左右指针每次各移一步left--, right++;if(right - left - 1 > len){len = right - left - 1;begin = left + 1;}}return s.substr(begin, len);
}

67.二进制求和

在这里插入图片描述

思路

在这里插入图片描述

  • 解法模拟二进制列式相加的过程
    1. 分别用两指针遍历两字符串,每次用变量carry累加二进制每一位
    2. 后将此次carry加到最终结果中,carry /= 2
    3. 由于字符串ret是逐渐累加结果的,翻转后的字符串才是二进制顺序

代码

string addBinary(string a, string b) {int carry = 0; // 记录是否有进位int cur1 = a.size()-1, cur2 = b.size()-1;string ret = "";while(cur1 >= 0 || cur2 >= 0 || carry){if(cur1 >= 0) carry += a[cur1--] - '0';if(cur2 >= 0) carry += b[cur2--] - '0';ret += carry % 2 + '0'; // carry%2即为相加的和carry /= 2; // 下一位的进位}// 由于字符串是逐渐累加结果的,翻转后的字符串才是二进制顺序reverse(ret.begin(), ret.end());return ret;
}

43.字符串相乘

在这里插入图片描述

思路

  • 题意分析:要求求出 两个字符串表示的整数 的乘积,且不得使用库函数直接进行整形和字符串的转换。
  • 解法模拟列式相乘的过程
    1. 与上题类似,我们对两字符串首先进行不进位相乘
      • 将输入的两个字符串逆序,从个位开始计算
      • 对应位置上的数字相乘,并将结果存储在临时数组中
      • 后将所有相乘结果相加
    2. 处理进位
      • 定义一个变量carry来记录进位数,然后从数组的第一位开始,将当前位置上的数字与carry相加,得到当前位置上的数字的和,并更新carry为下一位的进位数
      • 将每一位上的结果转换为字符,并添加到结果字符串ret中
      • 去掉结果字符串ret的前导零,并将其逆序,得到最终的结果
        在这里插入图片描述

代码

string multiply(string num1, string num2) {// 解法:模拟列式运算过程// 1. 逆序字符串,从个位开始计算reverse(num1.begin(), num1.end());reverse(num2.begin(), num2.end());// 2. 不进位相乘后相加int m = num1.size(), n = num2.size();vector<int> tmp(m + n - 1);for(int i = 0; i < m; ++i)for(int j = 0; j < n; ++j)tmp[i + j] += (num1[i] - '0') * (num2[j] - '0');// 3. 处理进位string ret = "";int cur = 0, carry = 0;while(cur < m + n - 1 || carry){if(cur < m + n - 1) carry += tmp[cur++]; // 记录当前位置元素ret += (carry % 10) + '0'; // ret加上个位carry /= 10; // 下一位的进位数}cout << ret;// 4. 去掉前导0while(ret.size() > 1 && ret.back() == '0')ret.pop_back();reverse(ret.begin(), ret.end());return ret;
}

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

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

相关文章

【固态钽表面贴装电容】 MIL-PRF-55365 美军标

钽电解电容器是体积效率、电气参数稳定、高可靠性和长使用寿命是主要考虑因素的应用的首选。 钽/氧化钽/二氧化锰系统的稳定性和对高温的耐受性使固体钽消泡器成为当今表面贴装组装技术的合适选择。 钽不是纯净状态的。 相反&#xff0c;它通常存在于许多氧化物矿物中&#xf…

编曲混音FL Studio21.2对电脑有什么配置要求

FL Studio 21是一款非常流行的音乐制作软件&#xff0c;它可以帮助音乐人和制作人创作出高质量的音乐作品。然而&#xff0c;为了保证软件的稳定性和流畅性&#xff0c;用户需要知道FL Studio 21对电脑的配置要求。本文将介绍FL Studio 21的配置要求&#xff0c;以帮助用户选择…

SQL基础知识4

一、内置函数 1、数值函数 1.1基本函数 1.2时间函数 二、存储过程 1、概述 2、分类 3、创建 4、总结 多了很多传递参数 三、存储函数 说明定义 例子 案例1 方法一 方法二 案例2 例子3 对比 复习

【贪心】受标签影响的最大值

/** 贪心&#xff1a;要想使子集分数最大&#xff0c;应选取values中较大的值。* 思路&#xff1a;使用一个哈希表来记录每个标签使用的次数&#xff0c;相同标签使其不超过useLimit限制* 对values进行降序排序&#xff0c;并对其进行遍历只要标签使用次数不超过限制就…

住宅IP和数据中心IP有何区别?为什么住宅IP更适合爬虫采集?

随着互联网的普及和发展&#xff0c;IP地址作为网络通信中的重要标识&#xff0c;其类型和应用场景也在不断变化。其中&#xff0c;住宅IP和数据中心IP是两种常见的IP类型&#xff0c;它们在某些方面存在明显的区别。本文将探讨这两种IP类型的区别以及为什么住宅IP更适合爬虫采…

python GUI开发:实现主屏幕控制副屏显示

实现效果 实现代码 import tkinter as tk import threading import pygetwindow as gw import subprocess import cv2 import pygame import time import screeninfodef func1():print("影音播放")open_child_window()def func5():print("视频播放")video…

数据库系列:InnoDB下实现高并发控制

1 介绍 并发控制是为了防止多用户并发使用数据库时造成数据错误和程序运行错误&#xff0c;保证数据的完整性。当多个事务并发地存取数据库时&#xff0c;就会产生同时读取和/或修改同一数据的情况。若对并发操作不加控制就可能会存取和存储不正确的数据&#xff0c;破坏数据库…

web前端(第二次作业)

1、计算用户指定的数值内的奇数和。例如用户输入的是 10&#xff0c;则计算 1 3 5 7 9 的和 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><script>var nprompt("请输入数值&#xff1a;&…

基于开源组件自主开发工作流引擎系统

目前基于Java语言开发的主流开源工作流引擎有osworkflow、jbpm、activiti、flowable、camunda。其中osworkflow、jbpm技术较老已经过时&#xff0c;activiti包括activiti5、activiti6、activiti7三个版本&#xff0c;flowable分开源版和商业版&#xff0c;camunda包括camunda7和…

ETCD 未授权访问实战案例

1、发现 etcd 未授权。 https://xxx200:2379/v2/keys 2、尝试在etcd里查询管理员的token&#xff0c;然后使用该token配合kubectl指令接管集群。 proxychains ./etcdctl --insecure-transportfalse --insecure-skip-tls-verify --endpointshttps://xxx0:2379/ get / --prefix…

12月威胁态势 | 0day占比超82%!两大勒索家族“均分天下”

近日&#xff0c;亚信安全正式发布《亚信安全2023年12月威胁态势报告》&#xff08;以下简称“报告”&#xff09;报告显示&#xff0c;12月份新增安全漏洞1511个&#xff0c; APT 攻防较量日趋复杂&#xff0c;成为网络空间与现实地缘政治融汇交织新的风险点&#xff1b;监测发…

精品量化公式——“主力拉升”,信号出现股价随时准备拉升

► 日线表现 代码评估 技术指标代码评估&#xff1a; 计算变量: HSL1:5;&#xff1a;设置了一个常数变量。 VAR0 到 VAR6&#xff1a;这些变量通过复杂的计算公式来定义&#xff0c;通常涉及收盘价、最高价、最低价、开盘价以及它们的历史数据。 技术指标和信号: 线: VAR6 …

使用Dockerfile构建镜像的详细指南

目录 前言 一、什么是 Dockerfile 二、使用 Dockerfile 定制镜像 开始构建镜像 上下文路径 三、指令详解 四、构建阿里云仓库 前言 Docker是一种流行的容器化平台&#xff0c;可以帮助开发人员和运维团队更轻松地构建、发布和运行应用程序。在Docker中&#xff0c;镜像是…

虾皮开通:如何在虾皮(Shopee)平台上开通店铺详细步骤

在全球电商市场的竞争中&#xff0c;越来越多的卖家选择在虾皮&#xff08;Shopee&#xff09;平台上开设店铺。作为东南亚地区最大的电子商务平台之一&#xff0c;虾皮提供了一个便捷的销售渠道&#xff0c;吸引了数百万的买家和卖家。如果您想在虾皮上开设自己的店铺&#xf…

使用官方构建工具来创建一个vue3的项目

当你使用 Vite 构建项目时&#xff0c;可能会发现在命令行界面无法选择是否包含 TypeScript 等其他基础配置。此外&#xff0c;使用 vue create 命令创建项目时&#xff0c;默认会使用 vue-cli&#xff0c;但项目启动等过程可能较慢。在这种情况下&#xff0c;你可以参考以下步…

Matlab论文插图绘制模板第135期—隐函数曲面图(fimplicit3)

在之前的文章中&#xff0c;分享了Matlab隐函数折线图的绘制模板&#xff1a; 进一步&#xff0c;再来分享一下隐函数曲面图。 先来看一下成品效果&#xff1a; 特别提示&#xff1a;本期内容『数据代码』已上传资源群中&#xff0c;加群的朋友请自行下载。有需要的朋友可以关…

CG Magic分享3dmax渲染太亮问题如何解决?

3D Max软件渲染时&#xff0c;渲染问题较多也是正常的&#xff0c;对于行业小白来说&#xff0c;渲染问题多也是能理解的&#xff0c;因为&#xff0c;小编经常在问答中&#xff0c;看到一些网友提问&#xff0c;3dmax渲染太亮怎么办&#xff1f; 3dmax渲染太亮了怎么回事&…

pycharm的使用技巧

1.新建文件时,自动生成代码 settings->editor->file and code templates,选择python script ${NAME} 文件名 ${DATE} 日期 2.自动补齐自定义段落 settings->editor->live templates,在右侧点击+号,添加自定义的内容 完成之后,在下方勾选python 3.修改注释的…

就业难,程序员年纪大了怎么办?

程序员作为一项技术工种&#xff0c;年龄的确可能成为职业生涯发展的一大障碍。但年龄并不是决定职业生涯终点的唯一因素&#xff0c;只要保持对技术的热爱、不断学习提升&#xff0c;并积极调整心态&#xff0c;仍有许多出路可以选择。 1. 职业发展路线 随着年龄的增长&#…

系分备考计算机网络传输介质、通信方式和交换方式

文章目录 1、概述2、传输介质3、网络通信4、网络交换5、总结 1、概述 计算机网路是系统分析师考试的常考知识点&#xff0c;本篇主要记录了知识点&#xff1a;网络传输介质、网络通信和数据交换方式等。 2、传输介质 网络的传输最常见的就是网线&#xff0c;也就是双绞线&…