LeetCode刷题 -- 字符串

news2024/12/16 12:14:01

目录

  • 最长公共前缀
    • 题目解析
    • 算法原理
    • 代码
  • 最长回文子串
    • 题目解析
    • 算法原理
    • 代码
  • 二进制求和
    • 题目解析
    • 算法原理
    • 代码
  • 字符串相乘
    • 题目解析
    • 算法原理
    • 代码

最长公共前缀

题目链接

题目解析

只需找出字符串中的公共的最长字符串即可

在这里插入图片描述

算法原理

1.法一:两两字符串比较,比较完和下一个字符串比较,找出所有字符串中共同的子串
2.法二:统一比较,固定i不变,逐一比较每行的第i个元素,存在不同就比较完成

3.法三:先算出最小字符串的长度,(统一比较)然后逐一比较每个字符串中字符是否相同

在这里插入图片描述

代码

// 解法一
// N:字符串的个数 M:字符串的平均长度
// 时间复杂度:O(N*M)
// 空间复杂度:O(1)
class Solution 
{
public:
    string longestCommonPrefix(vector<string>& strs) 
    {
       // 2. 统一比较
       for(int i = 0;i < strs[0].size();++i)// 列
       {
           char ch = strs[0][i];
           for(int j = 1;j < strs.size();++j)// 行
           {
             if(i == strs[j].size() || ch != strs[j][i]) 
             return strs[0].substr(0,i);
           }
       }    
       return strs[0];
    }
};
// 解法二
// N:字符串的个数 M:字符串的平均长度
// 时间复杂度:O(N*M)
// 空间复杂度:O(1)
class Solution 
{
public:
    string longestCommonPrefix(vector<string>& strs) 
    {
       // 2. 统一比较
       for(int i = 0;i < strs[0].size();++i)// 列
       {
           char ch = strs[0][i];
           for(int j = 1;j < strs.size();++j)// 行
           {
             if(i == strs[j].size() || ch != strs[j][i]) 
             return strs[0].substr(0,i);
           }
       }    
       return strs[0];
    }
};
// 解法三
// N:字符串的个数 M:字符串的平均长度
// 时间复杂度:O(N*M)
// 空间复杂度:O(M)
class Solution 
{
public:
    string longestCommonPrefix(vector<string>& strs)
    {
        // 3. 取出最小字串的长度
        //    然后逐一比较各位字符
        if(strs.size() == 1)
        return strs[0];
        string ret;
        int m = 200;
        for(int i = 0;i < strs.size();i++)
        {
            int k = strs[i].size();
            m = min(m,k);
        }    
        // 列
        for(int i = 0;i < m;i++)
        {
            // 行
            int flag = 1;
            char t = 0;
            for(int j = 0;j < strs.size()-1;++j)
            {
                t = strs[j][i];
                if(strs[j][i] != strs[j+1][i])
                {
                    flag = 0;
                    break;
                }
            }
            if(flag == 1)
            {
                ret.push_back(t);
            }
            else break;
        }
        return ret;
    }
};

最长回文子串

题目链接

题目解析

找出字符串的最长回文子串 bab aba 子串

在这里插入图片描述

算法原理

解法一:暴力枚举,每次枚举一个字符串,用O(N^2),再判断是否是回文串用O(N),三层循环,O(N^3),固定i = 0,每次从j = i开始枚举字符串,再判断字符串
解法二:从中间开始向两边扩展,固定一个中点,i遍历n次,第一种情况left和right都从i位置向两边扩展(字符串是奇数个字符),第二种情况,left从i位置,right从i+1位置向两边扩展(字符串是偶数个字符),这样字符串是奇数和偶数的情况都覆盖到了,两种情况遍历字符串2*n次,时间复杂度是O(N*N)

在这里插入图片描述

代码

class Solution 
{
public:
    string longestPalindrome(string s) 
    {
       int n = s.size();
       int begin = 0,len = 0;// 起始位置和长度
       // 时间复杂度:O(N^2) -> n * 2n
       // 空间复杂度:O(1)
       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);
    }
};

二进制求和

题目链接

题目解析

按照二进制的加法求和

在这里插入图片描述

算法原理

高精度算法
用t来记录两个字符串各个位上的加和,t%2是相加之后的值,t/2是进位,t再和下一次两个字符串各位上的值相加如此往复即可得到答案,可以自己模拟一遍

在这里插入图片描述

代码

class Solution 
{
public:
    string addBinary(string a, string b) 
    {
        // 高精度加法
        // 时间复杂度:O(ab字符串长的那个)
        // 空间复杂度:O(ab字符串长的那个)
        string ret;
        int t = 0;
        int cur1 = a.size() - 1,cur2 = b.size() - 1;
        while(cur1 >= 0|| cur2 >= 0|| 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;
    }
};

字符串相乘

题目链接

题目解析

两个字符串相乘

在这里插入图片描述

算法原理

法一:模拟,固定一个字符和其他字符串相乘,两个for循环,注意要先逆置后计算,先要加入前导零,<高位相乘的时候要补上零>,表示逆序,加完后就是逆序的结果了 <最后处理前导零并且要逆序回来>
法二:1. 无进位相乘然后相加(注意是逆序的)并且最后乘出来的数组大小是m+n-1(按下标相加的大小来看)
  1. 处理进位 (t表示数组中的值,t%10 -> 该位的数值 ,t / 10 ->进位)
  2. 处理前导零
  3. 逆序

在这里插入图片描述

代码

class Solution 
{
public:
    string multiply(string num1, string num2) 
    {
        // 高精度乘法
        // 先无进位相乘再相加,处理进位,和前导零
        //  1. 准备工作
        int n = num1.size(),m = num2.size();
        // 逆置字符串
        reverse(num1.begin(),num1.end());
        reverse(num2.begin(),num2.end());
        vector<int> tmp(n+m-1);
        
        // 2.无进位相乘再相加
        for(int i = 0;i < n;++i)
         for(int j = 0;j < m;++j)
         tmp[i + j] += (num1[i] - '0') * (num2[j] - '0');

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

        // 4. 处理前导零 逆置后零在后面 0 02 -> 20
        //while(ret.size() > 1 && ret[ret.size()-1] == '0')  ret.pop_back();
        // ret.back()
        while(ret.size() > 1 && ret.back() == '0') ret.pop_back();
        reverse(ret.begin(),ret.end());
        return ret;
    }
};

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

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

相关文章

4G模块详解

在之前的教程中&#xff0c;无线通信技术我们学习了蓝牙和 WiFi&#xff0c;今天我们要来学习 4G。 4G 模块在距离上有个突破&#xff0c;它不像蓝牙短距离&#xff0c;也不像 WiFi 只能在局域网&#xff0c;4G 模块可使用户无论在哪&#xff0c;只要有 4G 网络信号覆盖&#…

uni-app实现小程序、H5图片轮播预览、双指缩放、双击放大、单击还原、滑动切换功能

前言 这次的标题有点长&#xff0c;主要是想要表述的功能点有点多&#xff1b; 简单做一下需求描述 产品要求在商品详情页的头部轮播图部分&#xff0c;可以单击预览大图&#xff0c;同时在预览界面可以双指放大缩小图片并且可以移动查看图片&#xff0c;双击放大&#xff0…

数据地图怎么做?推荐这款数据可视化地图生成器

在数字化与信息化高速发展的今天&#xff0c;企业迎来了前所未有的发展机遇&#xff0c;规模迅速扩张&#xff0c;市场版图不断延伸。然而&#xff0c;伴随着这种快速的发展&#xff0c;一个不容忽视的问题逐渐浮出水面——如何精准高效地掌握分布在各地的分公司、业务点乃至整…

hive—常用的日期函数

目录 1、current_date 当前日期 2、now() 或 current_timestamp() 当前时间 3、datediff(endDate, startDate) 计算日期相差天数 4、months_between(endDate, startDate) 日期相差月数 5、date_add(startDate, numDays) 日期加N天 6、date_sub(startDate, numDays) 日期减…

【原生js案例】如何让你的网页实现图片的按需加载

按需加载&#xff0c;这个词应该都不陌生了。我用到你的时候&#xff0c;你才出现就可以了。对于一个很多图片的网站&#xff0c;按需加载图片是优化网站性能的一个关键点。减少无效的http请求&#xff0c;提升网站加载速度。 感兴趣的可以关注下我的系列课程【webApp之h5端实…

大模型运用-Prompt Engineering(提示工程)

什么是提示工程 提示工程 提示工程也叫指令工程&#xff0c;涉及到如何设计、优化和管理这些Prompt&#xff0c;以确保AI模型能够准确、高效地执行用户的指令&#xff0c;如&#xff1a;讲个笑话、java写个排序算法等 使用目的 1.获得具体问题的具体结果。&#xff08;如&…

相位小数偏差(UPD)估计基本原理

PPP中的一个关键性难题在于非差模糊度固定&#xff0c;成功固定非差模糊度可以使 PPP 的收敛速度和定位精度得到显著提升 。 相位小数偏差 (UPD) 是致使相位模糊度失去整数特性的主要因素&#xff0c;精确估计并校正 UPD 是实现非差模糊度固定的重要前提&#xff0c;也是实现…

ES倒排索引实现? ES 索引文档过程?ES并发下读写一致?

ES倒排索引实现&#xff0c; ES 索引文档过程&#xff0c;ES并发下读写一致 一、Elasticsearch的基本概念二、Elasticsearch的工作原理简述三、Elasticsearch的应用场景四、面试问题问题1&#xff1a;Elasticsearch中的分片和副本是如何工作的&#xff1f;分片和副本的大小和数…

【h5py】 提取mat文件中的HDF5格式的数据

h5py 提取mat文件中的HDF5格式的数据 使用纯Python查看数据配合Matlab后&#xff0c;使用Python查看数据 一、使用纯Python查看文件数据内容 原理&#xff1a;当HDF5存储的是struct类型数据&#xff0c;解析时要像一棵树&#xff0c;我们需要逐层次的去解析&#xff0c;直到…

【数据分享】2013-2023年我国省市县三级的逐年CO数据(免费获取\excel\shp格式)

空气质量数据是在我们日常研究中经常使用的数据&#xff01;之前我们给大家分享了2000-2023年的省市县三级的逐年PM2.5数据、2000-2023年的省市县三级的逐年PM10数据、2013-2023年的省市县三级的逐年SO2数据、2000-2023年省市县三级的逐年O3数据和2008-2023年我国省市县三级的逐…

《九重紫》逐集分析鉴赏第一集(下)

主标题&#xff1a;《九重紫》一起追剧吧 副标题&#xff1a;《九重紫》逐集分析鉴赏第一集&#xff08;下&#xff09;/《九重紫》逐集分析鉴赏1 接上回分解&#xff0c;窦昭和宋墨都安置城外万佛寺 交谈没一会儿&#xff0c;天还未亮&#xff0c;兵临寺下 记住这个人&…

Summarizing and Understanding Large Graphs

Summarizing and Understanding Large Graphs【总结和理解大规模图】 ☆ 研究背景 大规模图的理解和可视化是一个重要的开放性问题现有的社区发现和聚类方法无法很好地总结图的特征需要一种能够发现和描述图中重要结构的方法 ★ 成果简介 提出了VoG(Vocabulary-based summar…

人工智能系统

介绍人工智能 的基础书 点击这里 1.1 深度学习的历史&#xff0c;现状与发展 本章将介绍深度学习的由来&#xff0c;现状和趋势&#xff0c;让读者能够了解人工智能系统之上的深度学习负载的由来与趋势&#xff0c;为后面理解深度学习系统的设计和权衡形成初步的基础。我们在后…

康佳Android面试题及参考答案(多张原理图)

JVM 内存分布和分代回收机制是什么? JVM 内存主要分为以下几个区域。 堆(Heap)是 JVM 管理的最大的一块内存区域,主要用于存放对象实例。所有线程共享堆内存,在堆中又分为年轻代(Young Generation)和老年代(Old Generation)。年轻代又分为 Eden 区和两个 Survivor 区(…

(css)element中el-select下拉框整体样式修改

(css)element中el-select下拉框整体样式修改 重点代码&#xff08;颜色可行修改&#xff09; // 修改input默认值颜色 兼容其它主流浏览器 /deep/ input::-webkit-input-placeholder {color: rgba(255, 255, 255, 0.50); } /deep/ input::-moz-input-placeholder {color: rgba…

论文概览 |《Sustainable Cities and Society》2024.12 Vol.116

本次给大家整理的是《Sustainable Cities and Society》杂志2024年12月第116期的论文的题目和摘要&#xff0c;一共包括52篇SCI论文&#xff01; 论文1 Enhancing road traffic flow in sustainable cities through transformer models: Advancements and challenges 通过变压…

【电源专题】开关转换器的三种过流保护方案

开关转换器内部集成功率开关,使限流保护成为基本功能。常用限流方案有三种:恒流限流、折返限流和打嗝模式限流。 恒流限流 对于恒流限流方案,当发生过载情况时,输出电流保持恒定值(ILIMIT)。因此,输出电压会下降。这种方案通过逐周期限流实现,利用流经功率开关的峰值电感…

网络与安全

文章目录 网络协议OSI七层模型TCP/IP协议族TCP协议UDP协议HTTP协议HTTPS协议 SocketSocket编程粘包与拆包 网络安全常见网络攻击及防护放火墙网络加密技术 跨域问题 网络协议 网络协议是计算机网络中设备和系统之间进行数据交换的规则和约定。它定义了数据的格式、传输方式、处…

鸿蒙项目云捐助第六讲鸿蒙App应用的首页导航资讯推荐功能的实现

鸿蒙项目云捐助第六讲鸿蒙App应用的首页导航资讯推荐功能的实现 前面的教程中已实现了启动页&#xff0c;登录页&#xff0c;注册页及首页的部分功能。这里有一些朋友提出问题&#xff0c;如何设置登录页面的背景图片。这里稍带说一个这个功能的实现。 一、登录页面的背景图片…

SpringCloud微服务实战系列:03spring-cloud-gateway业务网关灰度发布

目录 spring-cloud-gateway 和zuul spring webflux 和 spring mvc spring-cloud-gateway 的两种模式 spring-cloud-gateway server 模式下配置说明 grayLb://system-server 灰度发布代码实现 spring-cloud-gateway 和zuul zuul 是spring全家桶的第一代网关组件&#x…