【算法系列】字符串

news2025/1/12 20:57:52

目录

leetcode题目

一、最长公共前缀

二、最长回文子串

三、二进制求和

四、字符串相加

五、字符串相乘

六、仅仅反转字母

七、字符串最后一个单词的长度

八、验证回文串

九、反转字符串

十、反转字符串 II

十一、反转字符串中的单词 III


leetcode题目

一、最长公共前缀

14. 最长公共前缀 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/longest-common-prefix/1.题目解析

求所有字符串的最长公共前缀

2.算法分析

解法一: 将所有字符串两两比较,求最长公共前缀

解法二: 统一比较所有字符串,当某个字符串的i位置字符不相等,或者i位置在某个字符串中越界,就停止比较, 返回结果即可

3.算法代码

解法一:

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) 
    {
        string ret = strs[0];
        for(int i = 1; i < strs.size(); i++)
            ret = find_common(ret, strs[i]);
        return ret;
    }

    string find_common(string s1, string s2)
    {
        int i = 0;
        while(i < s1.size() && i < s2.size() && s1[i] == s2[i])
            i++;
        return s1.substr(0, i);
    }
};

解法二:

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. 最长回文子串 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/longest-palindromic-substring/description/1.题目解析

求一个字符串的最长回文子串

2.算法分析

中心扩展算法:

1.固定一个中心点

2.从中心点开始,向两边扩展
注意: 奇数长度以及偶数长度都需要考虑

时间复杂度 O(N^2)

3.算法代码

class Solution {
public:
    string longestPalindrome(string s) 
    {
        int begin = 0, len = 0, n = s.size();
        for(int i = 0; i < n; i++) //1.固定一个中心点
        {
            //2.从中心点开始,向两边扩展
            //2.1 奇数长度的扩展
            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;
            }

            //2.2 偶数长度的扩展
            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);
    }
};

三、二进制求和

1.题目解析

给两个二进制字符串,以二进制字符串形式返回他们的和

2.算法分析

定义两个下标,从字符串结尾开始向前遍历相加,t 存储相加后的结果,注意进位即可~

3.算法代码

class Solution {
public:
    string addBinary(string a, string b) 
    {
        string ret;
        int cur1 = a.size()-1, cur2 = b.size()-1;
        int t = 0;
        while(cur1 >= 0 || cur2 >= 0 || t) //有可能cur1和cur2都走到了空,t中还存储着进位
        {
            if(cur1 >= 0) t += a[cur1--] - '0';
            if(cur2 >= 0) t += b[cur2--] - '0';
            ret += t % 2 + '0';
            t /= 2;            
        }
        reverse(ret.begin(), ret.end());
        return ret;
    }
};

四、字符串相加

415. 字符串相加 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/add-strings/1.题目解析

以字符串形式给出两个整数,返回两整数相加之后的字符串形式

2.算法分析

本题与题目三 "二进制求和" 解法是完全一样的,大家参照题目三即可~

3.算法代码

class Solution 
{
public:
    string addStrings(string num1, string num2) 
    {
        int cur1 = num1.size()-1, cur2 = num2.size()-1;
        int t = 0;
        string ret;
        while(cur1 >= 0|| cur2 >= 0 || t)
        {
            if(cur1 >= 0) t += num1[cur1--] - '0';
            if(cur2 >= 0) t += num2[cur2--] - '0';
            ret += t % 10 + '0';
            t /= 10;
        }
        reverse(ret.begin(), ret.end());
        return ret;
    }
};

五、字符串相乘

43. 字符串相乘 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/multiply-strings/1.题目解析

给定以字符串形式给出的两个非负整数,以字符串形式返回两数的乘积

2.算法分析

解法一:模拟列竖式运算 (也就是我们在演草纸上如何算乘法,就如何写代码即可

解法二:对解法一优化 -> 无进位相乘再相加,最后处理进位

下标的规律:  当计算下标为 i 和下标为 j 的两个数相乘时,最终结果放在下标为 i+j 的位置即可

细节问题:处理前导0, 当相乘的两个数字有1个为0时,结果应该是0,但是我们的做法算出来是0000等,因此需要特殊处理

3.算法代码

class Solution {
public:
    string multiply(string n1, string n2) {
        //1.准备工作
        int m = n1.size(), n = n2.size();
        reverse(n1.begin(), n1.end()); //123->321
        reverse(n2.begin(), n2.end()); //456->654
        vector<int> tmp(m+n-1);

        //2.无进位相乘然后相加
        for(int i = 0; i < m; i++)
            for(int j = 0; j < n; j++)
                tmp[i+j] += (n1[i] - '0') * (n2[j] - '0');

        //3.处理进位
        int cur = 0, t = 0;
        string ret;
        while(cur < m + n -1 || t != 0)
        {
            if(cur < m+n-1) t += tmp[cur++];
            ret += t % 10 + '0';
            t /= 10;
        }

        //4.处理前导零
        while(ret.size() > 1 && ret.back() == '0') ret.pop_back(); 
        
        reverse(ret.begin(), ret.end());
        return ret;
    }
};

六、仅仅反转字母

917. 仅仅反转字母 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/reverse-only-letters/1.题目解析

给定一个字符串,只将字母翻转,其他字符不变

2.算法分析

双指针策略: left从头遍历,right从尾遍历,遍历过程中,遇到非字母,left++, right--, 遇到了字母,就交换即可~

ps: 判断字符是否是字母借助库函数: isalpha

3.算法代码

class Solution {
public:
    string reverseOnlyLetters(string s) 
    {
        size_t left = 0, right = s.size() -1;
        while(left < right)
        {
            while(left < right && !isalpha(s[left]))
                left++;
            while(left < right && !isalpha(s[right]))
                right--;
            swap(s[left], s[right]);
            left++;
            right--;
        }
        return s;
    }
};

七、字符串最后一个单词的长度

字符串最后一个单词的长度_牛客题霸_牛客网 (nowcoder.com)icon-default.png?t=N7T8https://www.nowcoder.com/practice/8c949ea5f36f422594b306a2300315da?tpId=37&&tqId=21224&rp=5&ru=/activity/oj&qru=/ta/huawei/question-ranking1.题目解析

字符串中的单词以空格分割,求出字符串最后一个单词的长度

2.算法分析

直接调用string类的接口rfind, 从右向左找到第一个空格位置pos即可,用字符串总长度-pos-1

3.算法代码

#include <iostream>
using namespace std;
int main() 
{
    string s;
    while(getline(cin, s))
    {
        int pos = s.rfind(' ');
        cout << s.size() - pos - 1;
    }
    return 0;
}

八、验证回文串

125. 验证回文串 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/valid-palindrome/1.题目解析

移除所有的非字母数字字符并且大写转小写之后,正着读和反着读是一样的,则是回文串

2.算法分析

先将所有的大写字母转为小写字母或是将所有的小写字母转为大写字母,然后双指针遍历即可!遍历过程中注意 left < right ,防止越界访问,并且不能加等号, 因为当 s= ",." 时,会出现误判~

3.算法代码

class Solution {
public:
    bool isPalindrome(string s) 
    {
        //大写转小写
        for(auto& e: s)
            e = tolower(e);
        
        //验证回文串
        int left = 0, right = s.size()-1;
        while(left < right)
        {
            while(left < right && !isalpha(s[left]) && !isdigit(s[left])) left++;
            while(left < right && !isalpha(s[right]) && !isdigit(s[right])) right--;
            if(s[left] != s[right]) return false;
            left++, right--;
        }
        return true;
    }
};

九、反转字符串

344. 反转字符串 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/reverse-string/description/1.题目解析

反转字符串

2.算法分析

双指针策略

3.算法代码

class Solution {
public:
    void reverseString(vector<char>& s) {
        int left = 0;
        int right = s.size()-1;
        while(left < right)
        {
            swap(s[left], s[right]);
            left++;
            right--;
        }
    }
};

十、反转字符串 II

541. 反转字符串 II - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/reverse-string-ii/

1.题目解析

每2k个字符翻转前k个字符,如果剩余字符少于k个,则全部反转,如果剩余字符在k到2k之间,则翻转前k个字符,剩余字符保持不变~

2.算法分析

3.算法代码

class Solution {
public:
    string reverseStr(string s, int k) {
        int i= 0;
        while(s.begin()+2*k*i+k < s.end())
        {
            reverse(s.begin()+2*k*i, s.begin()+2*k*i+k);
            i++;
        }
        if(s.begin()+2*k*i < s.end())
            reverse(s.begin()+2*k*i, s.end()); //剩余字符<k个,全部翻转
        return s;
    }
};

十一、反转字符串中的单词 III

557. 反转字符串中的单词 III - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/reverse-words-in-a-string-iii/

1.题目解析

反转字符串中的所有单词

2.算法分析

使用string提供的find接口,start下标记录一个单词的开始位置,finish下标记录单词结束后的空格位置,用reverse函数对单词进行翻转,start置成下一个单词的开始位置(finish+1), 然后重复上述过程~

3.算法代码

class Solution {
public:
    string reverseWords(string s) {
        size_t start = 0, finish = 0;
        while(finish != s.size())
        {
            finish = s.find(' ', start); //从start位置开始找空格
            if(finish == string::npos) finish = s.size(); //最后一个单词后面没有空格,将finish置成最后一个位置
            reverse(s.begin() + start, s.begin() + finish);
            start = finish + 1; //把start置成下一个单词的第一个位置
        }
        return s;
    }
};

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

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

相关文章

[Kubernetes] 安装KubeSphere

选择4核8G&#xff08;master&#xff09;、8核16G&#xff08;node1&#xff09;、8核16G&#xff08;node2&#xff09; 三台机器&#xff0c;按量付费进行实验&#xff0c;CentOS7.9安装Docker安装Kubernetes安装KubeSphere前置环境: nfs和监控安装KubeSphere masternode1no…

从零开始学AI绘画,万字Stable Diffusion终极教程(三)

【第3期】Lora模型 欢迎来到SD的终极教程&#xff0c;这是我们的第三节课 这套课程分为六节课&#xff0c;会系统性的介绍sd的全部功能&#xff0c;让你打下坚实牢靠的基础 1.SD入门 2.关键词 3.Lora模型 4.图生图 5.controlnet 6.知识补充 在SD里面&#xff0c;有一个…

基础I/O--文件系统

文章目录 回顾C文件接口初步理解文件理解文件使用和并认识系统调用open概述标记位传参理解返回值 closewriteread总结 文件描述符fd0&1&2理解 回顾C文件接口 C代码&#xff1a; #include<stdio.h> int main() { FILE *fpfopen("log.txt",&…

基于Pytorch深度学习——GPU安装/使用

本文章来源于对李沐动手深度学习代码以及原理的理解&#xff0c;并且由于李沐老师的代码能力很强&#xff0c;以及视频中讲解代码的部分较少&#xff0c;所以这里将代码进行尽量逐行详细解释 并且由于pytorch的语法有些小伙伴可能并不熟悉&#xff0c;所以我们会采用逐行解释小…

用git上传本地文件到github

两种方式&#xff1a;都需要git软件&#xff08;1&#xff09;VScode上传 &#xff08;2&#xff09;直接命令行&#xff0c;后者不需要VScode软件 &#xff08;1&#xff09;vscode 上传非常方便&#xff0c;前提是下载好了vscode和git软件 1 在项目空白处右击&#xff0c;弹…

字符函数与字符串函数(2)

遇见她如春水映莲花 字符函数与字符串函数&#xff08;2&#xff09; 前言一、strcatstrncat 二、strcmpstrncmp在这里插入图片描述 三、strstr四、strtok五、strerror总结 前言 根据上期字符函数与字符串函数我们可以了解到字符函数与个别字符串函数的用法&#xff0c; 那么接…

手写一个uart协议——rs232

先了解一下关于uart和rs232的基础知识 文章目录 一、RS232的回环测试1.1模块整体架构1.2 rx模块设计1.2.1 波形设计1.2.2代码实现与tb1.2.4 仿真 1.3 tx模块设计1.3.1 波形设计1.3.2 代码实现与tb1.3.4 顶层设计1.3.3 仿真 本篇内容&#xff1a; 一、RS232的回环测试 上位机…

改变视觉创造力:图像合成中基于样式的生成架构的影响和创新

原文地址&#xff1a;revolutionizing-visual-creativity-the-impact-and-innovations-of-style-based-generative 2024 年 4 月 30 日 介绍 基于风格的生成架构已经开辟了一个利基市场&#xff0c;它将机器学习的技术严谨性与类人创造力的微妙表现力融为一体。这一发展的核…

4.3 JavaScript变量

4.3.1 变量的声明 JavaScript是一种弱类型的脚本语言&#xff0c;无论是数字、文本还是其他内容&#xff0c;统一使用关键词var加上变量名称进行声明&#xff0c;其中关键词var来源于英文单词variable&#xff08;变量&#xff09;的前三个字母。 可以在声明变量的同时对其指定…

汇川AM400PLC通过EtherCAT总线控制禾川X3E伺服使能和点动控制

进行通信之前需要安装禾川X3E的XML文件&#xff0c;具体方法如下&#xff1a; 1、汇川AM400PLC和X3E通信配置 汇川AM400PLC和禾川X3E伺服EtherCAT通信-CSDN博客文章浏览阅读29次。1、汇川H5UPLC和X3E伺服EtherCAT总线控制汇川H5U PLC通过EtherCAT总线控制SV660N和X3E伺服_伺服…

转速和频率转换功能块(CODESYS ST源代码)

1、转速/频率常用转换关系 转速/频率/线速度/角速度计算FC_200 plc计算角速度-CSDN博客文章浏览阅读3.2k次。里工业控制张力控制无处不在,也衍生出很多张力控制专用控制器,磁粉制动器等,本篇博客主要讨论PLC的张力控制相关应用和算法,关于绕线机的绕线算法,大家可以参看专…

并行魔法:揭秘scikit-learn中的Bagging并行训练技术

并行魔法&#xff1a;揭秘scikit-learn中的Bagging并行训练技术 随着大数据时代的到来&#xff0c;机器学习模型的训练时间越来越长&#xff0c;尤其是在处理大规模数据集时。如何高效地训练模型成为了一个亟待解决的问题。幸运的是&#xff0c;scikit-learn库为我们提供了一种…

如何访问远程MySQL数据库?

访问远程MySQL数据库是在进行数据库开发和运维工作中经常遇到的需求。本文将介绍如何使用合适的工具和方法进行远程访问MySQL数据库。 什么是天联组网 天联组网是一款异地组网内网穿透产品&#xff0c;由北京金万维科技有限公司自主研发。天联能够在任何网络环境下实现不同地区…

Vitis HLS 学习笔记--HLS眼中的完美循环嵌套

目录 1. 简介 2. 示例 2.1 不完美循环 2.2 完美循环 2.3 HLS 眼中的循环 3. 总结 1. 简介 在处理嵌套循环时&#xff08;HDL或HLS工具中&#xff09;&#xff0c;优化循环结构对于实现最佳性能至关重要。嵌套循环的性能优化直接影响着计算的时延和资源利用率。创建完美嵌…

Redis 实战2

系列文章目录 本文将从字典的实现、哈希算法、解决键冲突、rehash、渐进式rehash几方面来阐述 Redis 实战Ⅱ 系列文章目录字典的实现哈希算法解决键冲突rehash渐进式 rehash渐进式 rehash 执行期间的哈希表操作 字典 API总结 字典的实现 Redis 的字典使用哈希表作为底层实现&…

什么是数据工程?

目录 一、什么是数据工程&#xff1f; 二、数据工程在医疗行业中的应用 三、数据工程在精准医疗方面的应用有哪些&#xff1f; 一、什么是数据工程&#xff1f; 数据工程是一个综合性的技术学科&#xff0c;涵盖了从数据的收集、存储、处理、分析到应用的整个数据处理过程。…

深入了解 Arthas:Java 应用程序诊断利器

序言 在 Java 应用程序的开发和运维过程中&#xff0c;诊断和解决性能问题是一项非常重要的任务。而 Arthas 作为一款由阿里巴巴开发的 Java 应用程序诊断工具&#xff0c;提供了一系列强大的功能&#xff0c;帮助开发人员实时监控、诊断和调优Java 应用程序。本文将深入介绍 …

光伏光热一体化技术PVT

1、PVT集热器简介 太阳能光伏光热一体化组件主要由光伏与光热两个部分组成。光伏部分采用技术成熟的太阳能光伏面板&#xff0c;通过控制系统为建筑提供所需电能&#xff0c;主要包括光伏电池、蓄电池、逆变器和控制器等构件。光热部分主要为集热器&#xff0c;将太阳能转换为热…

禅道项目管理系统 身份验证漏洞分析QVD-2024-15263

前言 最近不怎么更新了&#xff01;向小伙伴说明下 我不是什么组织 更不什么经销号&#xff08;尽管csdn有很多经销广告号&#xff09; 一确实是下岗了&#xff01;忙着为找工作而发愁。简历都投出去如同石沉大海能不愁吗!.哎...... 二是忙着论文及材料的事...…

领域驱动设计(DDD)笔记(一)基本概念

文章链接 领域驱动设计&#xff08;DDD&#xff09;笔记&#xff08;一&#xff09;基本概念-CSDN博客领域驱动设计&#xff08;DDD&#xff09;笔记&#xff08;二&#xff09;代码组织原则-CSDN博客领域驱动设计&#xff08;DDD&#xff09;笔记&#xff08;三&#xff09;后…