【优选算法】字符串

news2024/11/25 14:25:49

一、相关编程题

1.1 最长公共前缀

题目链接

14. 最长公共前缀 - 力扣(LeetCode)

题目描述

在这里插入图片描述

算法原理

在这里插入图片描述

编写代码

// 解法一:两两比较
class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        int k = strs[0].size(); //表示最长公共前缀的结束位置
        for(int i = 0; i < strs.size()-1; ++i)
        {
            for(int j = 0; j < k; ++j)
            {
                if(j==min(strs[i].size(), strs[i+1].size()) || strs[i][j] != strs[i+1][j])
                {
                    k = j;
                    break;
                }
            }
        }
        return string(strs[0], 0, k);
    }
};

// 解法二:统一比较
class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        int k = 0;
        while(k < strs[0].size())
        {
            char ch = strs[0][k];
            for(int i = 1; i < strs.size(); ++i)
            {
                if(k==strs[i].size() || strs[i][k]!=ch)
                    return string(strs[0], 0, k);
            }   
            ++k;
        }
        return strs[0];
    }
};

1.2 最长回文子串

题目链接

5. 最长回文子串 - 力扣(LeetCode)

题目描述

在这里插入图片描述

算法原理

在这里插入图片描述

编写代码

//中心扩展算法
class Solution {
public:
    string longestPalindrome(string s) {
        int maxlen = 0, maxi = 0, n = s.size();
        for(int i = 0; i < n; ++i) //依次枚举所有的中点
        {
            //奇数长度的扩展
            int j = i, k = i;
            for(; j>=0 && k<n; --j, ++k)
             if(s[j] != s[k]) break;
            if(maxlen < k-j-1)
            {
                maxlen = k-j-1;
                maxi = j+1;
            }
            //偶数长度的扩展
            j = i; k = i+1;
            for(; j>=0 && k<n; --j, ++k)
             if(s[j] != s[k]) break;
            if(maxlen < k-j-1)
            {
                maxlen = k-j-1;
                maxi = j+1;
            }
        }

        return s.substr(maxi, maxlen);
    }
};

1.3 二进制求和

题目链接

67. 二进制求和 - 力扣(LeetCode)

题目描述

在这里插入图片描述

算法原理

  • 应该从低位到高位进行加法运算,将每一位的加法结果%2(进制数)就是这一位的结果,/2就是这一位的进位。
  • 要保证将两个运算量的每一位都遍历相加,并不再有进位,此时结束循环。
  • 要将最终的计算结果逆序才能得到正确的答案。

编写代码

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>0)
        {
            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;
    }
};

1.4 字符串相乘

题目链接

43. 字符串相乘 - 力扣(LeetCode)

题目描述

在这里插入图片描述

算法原理

在这里插入图片描述

编写代码

//解法一:模拟
class Solution {
public:
    string multiply(string num1, string num2) {
        //为了从低位到高位相乘,先将两字符串逆序
        reverse(num1.begin(), num1.end());
        reverse(num2.begin(), num2.end());
        string tmp, ret; //tmp存储每位相乘的结果,ret是最终结果

        //用num1的每一位与num2相乘,再将tmp结果相加到ret
        for(int i = 0; i < num1.size(); ++i) 
        {
            tmp.clear();
            for(int k = 0; k < i; ++k) tmp+='0'; //高位相乘补'0'
            int mul = 0; //保存每位相乘的结果及进位
            for(int j = 0; j < num2.size(); ++j)
            {
                mul += (num1[i]-'0')*(num2[j]-'0');
                tmp+=mul%10+'0';
                mul/=10;
            }
            while(mul>0)
            {
                tmp+=mul%10+'0';
                mul/=10;
            }
            ret = StrSum(ret, tmp); 
        }
        //处理前导'0'
        int i = ret.size()-1;
        while(i>0) //注意个位的'0'保留
        {
            if(ret[i] != '0') break;
            else --i;
        }
        ret.resize(i+1);
        //将结果翻转
        reverse(ret.begin(), ret.end());
        return ret;
    }

    //两逆序字符串相加,返回的结果也是逆序的(从低位到高位)
    string StrSum(const string& str1,const string& str2)
    {
        int i = 0, j = 0, t = 0;
        string ret;
        while(i<str1.size() || j<str2.size() || t>0)
        {
            if(i<str1.size()) t+=str1[i++]-'0';
            if(j<str2.size()) t+=str2[j++]-'0';
            ret += t%10+'0';
            t/=10;
        }
        return ret;
    }
};

//解法二:无进位相乘再相加,最后处理进位
class Solution {
public:
    string multiply(string num1, string num2) {
        //为了从低位到高位相乘,先将两字符串逆序
        reverse(num1.begin(), num1.end());
        reverse(num2.begin(), num2.end());
        //无进位相乘然后相加
        int m = num1.size(), n = num2.size();
        vector<int> tmp(m+n-1, 0);
        for(int i = 0; i < m; ++i)
        {
            for(int j = 0; j < n; ++j)
            {
                tmp[i+j] += (num1[i]-'0')*(num2[j]-'0');
            }
        }
        //最后处理进位
        string ret;
        int t = 0, i = 0;
        while(i<tmp.size() || t>0)
        {
            if(i<m+n-1) t+=tmp[i++];
            ret+=t%10+'0';
            t/=10;
        }
        //处理前导'0'
        while(ret.size()>1 && ret.back() == '0') ret.pop_back();
        reverse(ret.begin(), ret.end());
        return ret;
    }
};

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

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

相关文章

《QT从基础到进阶·四十二》QT运行后项目图标,exe图标问题,VS加载.pro文件问题

1、QT图标有时候不能正常显示&#xff0c;不管是加到qrc还是用绝对路径&#xff0c;都无法正常显示&#xff0c;之前是可以的&#xff0c;具体原因目前还不太清楚&#xff0c;我在VS项目——vcpkg——use vcpkg把否改为是就可以了 2、出现无法定位程序输入点的报错&#xff0c…

Java Web学习笔记27——对话框、表单组件

常见组件对话框&#xff1a; Dialog对话框&#xff1a;在保留当前页面状态下&#xff0c;告知用户并承载相关操作。 dialogTableVisible: false 默认是不可见的。 在按钮属性中设置为true的意思&#xff0c;点击按钮的时候&#xff0c;才会true&#xff0c;对话框才会显示。 …

基于Springboot+vue实现的汽车服务管理系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;spring…

【Python】解决Python报错:TypeError: ‘int‘ object is not callable

​​​​ 文章目录 引言1. 错误详解2. 常见的出错场景2.1 误用变量名2.2 混淆函数与结果 3. 解决方案3.1 明确变量类型3.2 使用函数调用() 4. 预防措施4.1 代码审查4.2 单元测试 结语 引言 在Python开发中&#xff0c;TypeError 是一种常见的错误类型&#xff0c;尤其是在尝试…

AI图书推荐:用ChatGPT来写非虚构类书籍

这本书《用ChatGPT来写非虚构类书籍 》&#xff08;ChatGPT For KDP_ A manual from an experienced self-publisher to nonfiction authors for writing the book you were born to write with ChatGPT prompts mastering&#xff09;是一本专为非虚构类书籍作者编写的指南&am…

初识C++ · 模拟实现list

目录 前言 1 push_back pop_back 2 迭代器类 2.1 ! 2.2 -- 2.3 * 3 Print_List 4 有关自定义类型 5 有关const迭代器 6 拷贝构造 赋值 析构 Insert erase 前言 有了string&#xff0c;vector的基础&#xff0c;我们模拟实现list还是比较容易的&#xff0c;这里同…

pc之间的相互通信详解

如图&#xff0c;实现两台pc之间的相互通信 1.pc1和pc2之间如何进行通讯。 2.pc有mac和ip&#xff0c;首先pc1需要向sw1发送广播&#xff0c;sw1查询mac地址表&#xff0c;向router发送广播&#xff0c;router不接受广播&#xff0c;router的每个接口都有ip和mac&#xff0c;…

windows下 Qt 操作xlsx 和 csv

需求&#xff1a; 工作中遇到一个需求&#xff0c;有两张表格&#xff0c;一个xlsx表&#xff0c;一个csv表格&#xff0c;格式如下&#xff1a; 以csv表格中船台标识为基础&#xff0c;读取xlsx中的数据&#xff0c;如果存在该MMSI则把船名写道csv中对应船名的后面&#xff0…

四十三、openlayers官网示例Freehand Drawing解析——在地图上自由绘制图形

想要在地图上绘制自由图形&#xff0c;只需要在new Draw的时候多加一个配置项就行。 function addInteraction() {const value typeSelect.value;if (value ! "None") {draw new Draw({source: source,type: typeSelect.value,freehand: true, //是否自由绘制});ma…

TensorRT 精度debug分析工具

tensorRT还提供了一套可用于engine生成过程中debug的工具&#xff0c;包括Polygraphy、ONNX GraphSurgeon和PyTorch-Quantization。这些小工具用处很大&#xff0c;值得花时间进一步研究。 Debug方法示例 polygraphy Polygraphy是TensorRT官方提供的一系列小工具合集&#x…

面试(02)————Java集合篇

目录 一、为什么数组索引是从0开始&#xff1f;如果从1开始不行吗&#xff1f; 二、ArrayList底层的实现原理是什么&#xff1f; ​编辑三、ArrayList list new ArrayList(10)中的list扩容几次&#xff1f; 四、如何实现数组与List之间的转换&#xff1f; 五、ArrayList…

【STM32】µC/OS-III多任务程序

【STM32】C/OS-III多任务程序 一、探究目的二、探究原理2.1 嵌入式操作系统2.1.1 RTOS2.1.2 前后台系统2.1.2 C/OS-III 三、探究过程&#xff08;实验一&#xff09;3.1 μC/OS-III环境配置3.1.1 CubeMX配置3.1.2 下载μC/OS-III源码3.1.3 KEIL环境配置3.1.4 KEIL代码更改3.1.5…

【SpringBoot】项目搭建基本步骤(整合 Mybatis)

搭建 SpringBoot 项目有两种方式&#xff1a;使用 IDEA、或者在 Spring 官网下载。 1. IDEA 创建 打开 IDEA 后&#xff0c;英文版请点击 File -> New -> Project -> Spring Initialer。 中文版请点击 文件 -> 新建 -> 项目 -> Spring Initialer。 在打开的…

编译遇到找不到pcap.so 问题

1.locate 定义pcap.so locate pcap.so 如果存在则打印所有路径 使用软连接将pcap.so 的实际位置连接到编译的lib 目录下 ln -s /usr/lib/x86_64-linux-gnu/libpcap.so /usr/lib/libpcap.so 编译 提示 说明程序中编译的目标程序需要的库与现有的不兼容&#xff0c;一般都是3…

易语言高仿植物大战僵尸

易语言高仿植物大战僵尸 效果图运行教程与部分问题解决部分源码源码领取方式下期更新预报 效果图 运行教程与部分问题解决 在第一次运行代码的时候会出现一下情况&#xff0c;让我们去下载精易模块[v10.3.5] 那怎么运行呢&#xff1f;放心我为你们准备了这个模块&#xff0c;…

2024 年最新 Python 基于百度智能云实现文字识别 OCR 详细教程

文字识别 OCR 概述 文字识别OCR&#xff08;Optical Character Recognition&#xff09;提供多场景、多语种、高精度的文字检测与识别服务&#xff0c;多项ICDAR指标居世界第一。广泛适用于金融服务、财税报销、法律政务、保险医疗、快递物流、交通出行、教育培训等场景&#…

【庞加莱几何-02】反演定理和证明

文章目录 一、说明二、 inversion和 reflection三、圆反演的定义四、广义的圆反演成圆 关键词&#xff1a;inversion、reflection 一、说明 这里是庞加莱几何的第二篇文章&#xff0c;是庞加莱基本几何属性的研究。本篇主要说清楚&#xff0c;什么是反演&#xff0c;在反演情况…

ROS基础学习-ROS通信机制进阶

ROS通信机制进阶 目录 0.简介1.常用API1.1 节点初始化函数1.1.1 C++1.1.2 Python1.2 话题与服务相关函数1.2.1 对象获取相关1.2.1.1 C++1.2.1.2 Python1.2.2 订阅对象相关1.2.2.1 C++1.2.2.2 Python1.2.3 服务对象相关函数1.2.3.1 C++1.2.3.2 Python1.2.4 客户端对象相关1.2.4.…

vue 使用 Vxe UI vxe-print 实现复杂的 Web 打印,支持页眉、页尾、分页的自定义模板

Vxe UI vue 使用 Vxe UI vxe-print 实现复杂的 Web 打印&#xff0c;支持页眉、页尾、分页的自定义模板 官方文档 https://vxeui.com 查看 github、gitee 页眉-自定义标题 说明&#xff1a;vxe-print-page-break标签用于定义分页&#xff0c;一个标签一页内容&#xff0c;超…

QT 音乐播放器【二】 歌词同步+滚动+特效

文章目录 效果图概述代码解析歌词歌词同步歌词特效 总结 效果图 概述 先整体说明一下这个效果的实现&#xff0c;你所看到的歌词都是QGraphicsObject&#xff0c;在QGraphicsView上绘制(paint)出来的。也就是说每一句歌词都是一个图元(item)。 为什么用QGraphicsView框架&…