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

news2025/1/17 18:10:00

文章目录

  • 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];
            else
                break;
        }
        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. 去掉前导0
    while(ret.size() > 1 && ret.back() == '0')
        ret.pop_back();

    reverse(ret.begin(), ret.end());
    return ret;
}

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

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

相关文章

【Mybatis】说一下 mybatis 的一级缓存和二级缓存

​ &#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Mybatis ⛳️ 功不唐捐&#xff0c;玉汝于成 ​ 目录 前言 正文 一级缓存&#xff08;Local Cache&#xff09;&#xff1a; 范围&#xff1a; 生命周期&#xff1a; 默认开启&…

数据科学与大数据导论期末复习笔记(大数据)

来自于深圳技术大学&#xff0c;此笔记涵盖了期末老师画的重点知识&#xff0c;分享给大家。 等深分箱和等宽分箱的区别&#xff1a;等宽分箱基于数据的范围来划分箱子&#xff0c;每个箱子的宽度相等。等深分箱基于数据的观测值数量来划分箱子&#xff0c;每个箱子包含相同数量…

tcpdump常用参数以及wireshark密文解密

tcpdump常用参数以及wireshark密文解密 文章目录 一、tcpdump命令和常用参数二、在wireshark中协议解析 tcpdump常用参数 一、tcpdump命令和常用参数 tcpdump常用命令&#xff1a;tcpdump -i eth0 src host 11.6.224.1 and udp port 161 -s 0 -w 161.pcap &#xff08;161为sn…

(一)ROS的安装

&#xff08;一&#xff09;安装ubuntu18.04 系统&#xff08;虚拟机或者是物理机&#xff0c;在此不再介绍&#xff09; &#xff08;二&#xff09;添加ROS镜像源 apt 列表中没有ROS源&#xff0c;所以要手动添加 sudo sh -c . /etc/lsb-release && echo "deb…

mysql常见的需求,对于关键字的使用

如何使用MySQL将列数据转化为逗号分隔的形式。我们可以使用内置函数GROUP_CONCAT()来实现这个功能 如何使用MySQL将列数据转化为逗号分隔的形式。我们可以使用内置函数GROUP_CONCAT()来实现这个功能&#xff0c;也可以根据实际需求自定义一个函数。这种技术在一些需要对数据进…

imgaug库指南(28):从入门到精通的【图像增强】之旅(万字长文)

引言 在深度学习和计算机视觉的世界里&#xff0c;数据是模型训练的基石&#xff0c;其质量与数量直接影响着模型的性能。然而&#xff0c;获取大量高质量的标注数据往往需要耗费大量的时间和资源。正因如此&#xff0c;数据增强技术应运而生&#xff0c;成为了解决这一问题的…

linux-nfc neard 编译与安装

项目github地址&#xff1a; https://github.com/linux-nfc/neard git clone地址&#xff1a; https://github.com/linux-nfc/neard.git clone完源码切换到目录neard里。这个项目需要依赖一下库&#xff1a; - GCC compiler - D-Bus library - GLib library - Netlink (lib…

go语言(一)----声明常量

package mainimport ("fmt""time" )func main() {fmt.Print("hello go!")time.Sleep(1 * time.Second)}运行后&#xff0c;结果如下&#xff1a; 1、golang表达式中&#xff0c;加&#xff1b;和不加&#xff1b;都可以 2、函数的{和函数名一…

.net core 6 使用注解自动注入实例,无需构造注入 autowrite4net

像java使用autowrite一样使用 1、前提先注册到ioc容器当中 builder.Services.AddScoped 2、nuget引入AutoWrite4Net 3、启用 //启用自动注入 app.UseAutoWrite(); 4、在类上使用注解 [StartAutoWrite] public class NacosController : ControllerBase 5、实例上使用注解 …

【Linux】nc 网络诊断 | 文件传输 命令详解

目录 一、命令简介 二、命令使用 2.1 测试服务器 2.2 端口连通性测试 2.2.1tcp端口连通性测试 2.2.2udp端口连通性测试 2.3 文件及目录的传输 2.3.1 文件传输(TCP端口) 2.3.2 文件传输(UDP端口) 相关文章&#xff1a; 【网络】抓包工具Wireshark下载安装和基本使用教…

强化加密生态合规性:Token Explorer 助你一臂之力!

随着加密市场监管的不断加强&#xff0c;项目的合规风险可能会在一夜之间威胁到其可行性。然而&#xff0c;通过智能的分析技术进行全面的代币审计&#xff0c;可以帮助我们及时发现问题&#xff0c;保护项目的声誉。 Token Explorer 提供智能的专业分析&#xff0c;让我们了解…

linux安装QQ(官方正版)

QQ官网上有支持linux系统的版本&#xff0c;所以去官网直接下载正版就好。 安装步骤&#xff1a; 1.进入官网&#xff1a;https://im.qq.com/linuxqq/index.shtml 2.选择版本&#xff1a;X86版下载dep 如下所示&#xff1a; 3.下载qq安装包&#xff1a; 4.使用命令安装qq s…

高考志愿填报系统开发技术语言选择总结

开发高考志愿填报系统&#xff0c;需要考虑到系统的稳定性、安全性、易用性以及数据准确性。以下是针对高考志愿填报系统的技术方案选择建议&#xff1a; 1.后端技术&#xff1a;可以使用Python、Java、PHP等后端语言进行开发&#xff0c;考虑到易用性和开发效率&#xff0c;可…

MetaGPT学习笔记 - task1task2

章节&#xff1a;task1&task2 一.github地址&#xff1a;github.com/geekan/MetaGPT 二.MetaGPT: 多智能体框架​ 使 GPT 以软件公司的形式工作&#xff0c;协作处理更复杂的任务 MetaGPT输入一句话的老板需求&#xff0c;输出用户故事 / 竞品分析 / 需求 / 数据结构 / A…

UI设计中插画赏析和产品色彩分析

插画赏析&#xff1a; 1. 插画是设计的原创性和艺术性的基础 无论是印刷品、品牌设计还是UI界面&#xff0c;更加风格化的插画能够将不同的风格和创意加入其中&#xff0c;在激烈的竞争中更容易因此脱颖而出。留下用户才有转化。 2. 插画是视觉触发器&#xff0c;瞬间传达大量…

React16源码: React中的异步调度scheduler模块的源码实现

React Scheduler 1 ) 概述 react当中的异步调度&#xff0c;称为 React Scheduler发布成单独的一个 npm 包就叫做 scheduler这个包它做了什么&#xff1f; A. 首先它维护时间片B. 然后模拟 requestIdleCallback 这个API 因为现在浏览器的支持不是特别的多所以在浏览当中只是去…

【报错】NVIDIA 驱动版本不兼容 — NVIDIA driver on your system is too old

【报错】NVIDIA 驱动版本不兼容 — NVIDIA driver on your system is too old 报错信息查看torch版本查看nvidia驱动版本 报错信息 CUDA initialization: The NVIDIA driver on your system is too old (found version 11040). Please update your GPU driver by downloading …

投资半导体行业可靠吗?九方智投洪帮主助投资者深度剖析市场

近期,CES2024展会火热袭来,作为行业内知名活动,展会的官方数据显示本次参展企业达到了4000家。作为CES2024的特色主题,人工智能有望成为会议的重大亮点。 人工智能涉及到的领域包含方方面面,其中AI软件和硬件解决方案的发布将促进半导体行业需求,算力芯片和边缘侧AI的机会值得关…

纯前端实现加减运算验证码

纯前端实现加减运算验证码 实现效果 //页面展示 <template><view class"form-input-item" style"padding:8rpx 22rpx;"><input class"form-input" placeholder"请输入验证码" type"text" maxlength"6…

【计算机硬件】3、输入输出技术、总线结构

文章目录 输入输出技术内存与接口地址的编址方法1、 内存与接口地址独立编址方法2、内存与接口地址统一编址方法 计算机和外设间的数据交互方式1、程序控制(查询)方式2、程序中断方式3、DMA方式&#xff08;直接主存存取&#xff09; 总线结构 输入输出技术 内存与接口地址的编…