21字符串-简单操作

news2024/9/21 4:25:07

目录

字符串匹配

重要概念

BF算法

RK算法

LeetCode之路——344. 反转字符串

分析

LeetCode之路——541. 反转字符串 II

分析


字符串匹配

字符串匹配的算法很多,常见的有BF(Brute Force)、RK(Rabin-Karp)这两种比较简单、好理解的,当然也有BM(Boyer-Moore)和KMP(Knuth Morris Pratt)这两种比较难理解、更高效的。

重要概念

在字符串匹配中,有两个需要了解的概念——主串和模式串。比如说我们需要在字符串N中查找字符串M,那么N就是主串,M就是模式串。主串的长度如果记为n,模式串长度记为m,所以n>m。

BF算法

BF算法主打一个暴力匹配。举例说明:在字符串anbdbanc中查找anc。

BF算法极端情况下,我们每次都需要比对m个字符,要比对n-m+1次,算法的最坏情况时间复杂度是O(n*m)。

RK算法

是由两位发明者Rabin和Karp的名字命名的,可以理解为BF的升级版。

RK是基于哈希值的基础上进行比较的,我们知道主串中一共有n-m+1个子串,我们只需要计算出每个子串的哈希值,然后与模式串的哈希值比较,如果相等就是相同的。

假设a-z总计26个字母分别用1-24表示,对应的子串用26进制表示哈希值。

A和B是相邻两个子串相同部分,可以知道B = 26 * A。从这里例子中,我们很容易就能得出这样的规律:

相邻两个子串s[i-1]和s[i](i表示子串在主串中的起始位置,子串的长度都为m),对应的哈希值计算公式有交集,也就是说,我们可以使用s[i-1]的哈希值很快的计算出s[i]的哈希值。如果用公式表示的话,就是下面这个样子(h[i-1]对应子串S[i-1,i+m-2]的哈希值,h[i]对应子串S[i,I+m-1]的哈希值):

h[i]=26*(h[i-1]-26^(m-1)*s[i-1])+s[i+m-1]

以h2和h3举例,h[i-1]-26^(m-1)*s[i-1]就是A,h[i] = A * 26 + s[i+m-1],其中s[i-1]是h2中的n,s[i+m-1]是h3中的b。我们可以提前用长度为m的数组存放26的0到m次方,省去计算的时间。

整个RK算法包含两部分,计算子串哈希值和模式串哈希值与子串哈希值之间的比较。

  • 第一部分,我们前面也分析了,可以通过设计特殊的哈希算法,只需要扫描 一遍主串就能计算出所有子串的哈希值了,所以这部分的时间复杂度是O(n)。

  • 模式串哈希值与每个子串哈希值之间的比较的时间复杂度是O(1),总共需要比较n-m+1个子串的哈希值,所以,这部分的时间复杂度也是O(n)。所以,RK算法整体的时间复杂度就是O(n)。

暂时先介绍这两种算法,练练手应该能够了。

LeetCode之路——344. 反转字符串

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

示例 1:

输入:s = ["h","e","l","l","o"]
输出:["o","l","l","e","h"]

示例 2:

输入:s = ["H","a","n","n","a","h"]
输出:["h","a","n","n","a","H"]

提示:

  • 1 <= s.length <= 105

  • s[i] 都是 ASCII 码表中的可打印字符

分析

熟悉双指针的情况下,会很自然的想到首尾两指针向中间移动,一边遍历一边交换的解决方案。

class Solution {
    public void reverseString(char[] s) {
        for (int h = 0, t = s.length - 1; h < t; ++h, --t) {
            char tmp = s[h];
            s[h] = s[t];
            s[t] = tmp;
        }
    }
}
  • 时间复杂度:O(n)

  • 空间复杂度:O(1)

LeetCode之路——541. 反转字符串 II

给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

  • 如果剩余字符少于 k 个,则将剩余字符全部反转。

  • 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

示例 1:

输入:s = "abcdefg", k = 2
输出:"bacdfeg"

示例 2:

输入:s = "abcd", k = 2
输出:"bacd"

提示:

  • 1 <= s.length <= 104

  • s 仅由小写英文组成

  • 1 <= k <= 104

分析

就直接按照题意来,反转每个下标从2k的倍数开始的,长度为k的子串。若该子串长度不足k,则反转整个子串。

class Solution {
    public String reverseStr(String s, int k) {
        //定义一个表示字符串的长度的变量
        int len =s.length();
        //将字符串变为字符数组,方便当个字符遍历
        char[] chars= s.toCharArray();
        for(int left = 0; left<len; left +=2*k){
            //左指针是为了定义反转位置的开始,右指针定义反转位置的结束。
            //特别备注下,这边的Math.min()起到的作用是,字符小于k时,全部反转的效果。
            //当k>len的时候,就取len。
            reverse(chars, left, Math.min(left+k,len)-1);
        }
        //返回结果
        return new String(chars);
    }
    public void reverse(char[] chars, int left, int rigth){
        //只要左指针小于右指针就反转
        //这边是为了兼容处理 k >len情况下,将所有字符都反转
        while(left <rigth){
            char temp = chars[left];
            chars[left] =chars[rigth];
            chars[rigth] = temp;
            //左指针向右移动
            left++;
            //右指针向左移动
            rigth--;
        }
    }
}
  • 时间复杂度:O(n)

  • 空间复杂度:O(n),字符串转为数组,使用了O(n)的空间。

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

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

相关文章

3D开发工具HOOPS助力Eleven Dynamics加速开发QA自动化平台

Nexos平台提供强大的可视化功能&#xff0c;并将整体测量时间减少80%。 2021年10月19日&#xff0c;俄勒冈州本德市&#xff08;Newswire.com&#xff09;——工程软件开发工具包的领先供应商Tech Soft 3D今天宣布&#xff0c;Eleven Dynamics是一家位于瑞士的初创公司&#x…

CPU的执行流程

CPU的执行流程 取指令&#xff08;Instruction Fetch&#xff09;&#xff1a;CPU 从程序存储器&#xff08;通常是内存&#xff09;中获取要执行的下一条指令。这个过程包括以下步骤&#xff1a; CPU 从程序计数器&#xff08;Program Counter&#xff0c;PC&#xff09;中获…

1682653-80-0,四嗪染料试剂Tetrazine PEG5 NHS,四嗪五聚乙二醇活性脂

产品亮点&#xff1a;Tetrazine PEG5 NHS ester&#xff08;四嗪五聚乙二醇活性脂&#xff09;是一种高效能的生物活性化合物&#xff0c;拥有卓越的生物相容性和水溶性&#xff0c;用途广泛。CAS号&#xff1a;1682653-80-0&#xff0c;中文名&#xff1a;四嗪五聚乙二醇活性脂…

uniapp微信小程序自定义封装分段器。

uniapp微信小程序自定义封装分段器。 话不多说先上效果 这里我用的是cil框架 vue3 下面贴代码 组价代码&#xff1a; <template><view class"page"><viewv-for"(item, index) in navList":key"index"click"changeNav(ind…

逐字稿 | ViT论文逐段精读【论文精读】

目录 标题 摘要 1引言 1.1把 Transformer 用到视觉问题上的一些难处 1.2受到transformer可扩展性的启发&#xff0c;要用一个标准的transformer处理视觉问题&#xff0c;序列长度怎么办&#xff1f; 最相似的过往工作 2结论 3相关工作 4方法 4.1整个对图片的这个预处…

【通信系列 5 -- HTTPS 介绍】

文章目录 1.1 HTTPS链接网址1.1.1 HTTPS 产生背景1.1.2 HTTPS工作内容1.1.3 SSL/TLS1.1.4 TLS 的命名规范1.1.5 TLS 加密算法1.1.6 分组模式1.1.7 摘要算法1.1.8 非对称加密1.1.9 CA认证 1.2 openssl1.2.1 RSA 签名验签 1.1 HTTPS链接网址 HTTP 是一种 超文本传输协议(Hyperte…

服务器数据恢复-服务器硬盘指示灯黄灯闪烁的数据恢复案例

服务器数据恢复环境&#xff1a; 服务器面板上的硬盘指示灯显示黄色是一种警告&#xff0c;提示指示灯对应的服务器硬盘已经被服务器识别出存在故障&#xff0c;硬盘即将下线。如果出现这种情况&#xff0c;建议服务器管理员/运维人员及时用完好的硬盘替换显示黄色指示灯对应的…

新人如何做好功能测试,学会这几项够用了

根据一份报告&#xff0c;应用程序崩溃导致71&#xff05;的卸载。迫使用户卸载应用程序的其他原因是页面响应时间&#xff0c;混乱的UI&#xff0c;电池消耗等。这表明功能测试和非功能测试对于交付用户友好型应用程序的重要性。 一、测试基础的重要性 作为一名测试新人&…

设备巡检管理系统与隐患排查治理

如何才能将设备巡检做细做规范呢&#xff1f; 1.制定巡检制度和流程&#xff1a;通过建立明确的巡检制度和流程&#xff0c;并将其纳入企业的安全管理体系中。利用凡尔码平台制定一个详细的巡检计划&#xff0c;包括巡检的时间、地点、内容、检查方法和注意事项等&#xff0c;帮…

Windows如何运行anywhere

问题描述 在dist&#xff0c;目录中执行anywhere命令时&#xff0c;出现如下错误信息&#xff1a; anywhere : 无法加载文件 C:\Users\calos\AppData\Roaming\npm\anywhere.ps1&#xff0c;因为在此系 统上禁止运行脚本。有关详细信息&#xff0c;请参阅 https:/go.microso…

谷歌云 | 零售行业的生成式 AI:如何跟上步伐并取得领先

【Cloud Ace 是 Google Cloud 全球战略合作伙伴&#xff0c;在亚太地区、欧洲、南北美洲和非洲拥有二十多个办公室。Cloud Ace 在谷歌专业领域认证及专业知识目前排名全球第一位&#xff0c;并连续多次获得 Google Cloud 各类奖项。作为谷歌云托管服务商&#xff0c;我们提供谷…

Css框架之星星评价功能

我一直将自学的系统叫做CSS框架&#xff0c;其实这是一个CssJavascriptHtml的代码框架&#xff0c;更准确的说应该叫前台框架。这类前台框架&#xff0c;我一直用先写CSS代码&#xff0c;后写JavaScript&#xff0c;最后记录HTML代码&#xff0c;实际在开发中&#xff0c;我喜欢…

计算机网络第四章——网络层(末)

赌书消得泼茶香当时只道是寻常 文章目录 概述&#xff1a;组播机制是让源计算机一次发送的单个分组可以抵达用一个组地址标识的若干目标主机&#xff0c;并被它们正确接收&#xff0c;组播仅应用于UDP 因特网中的IP组播也使用组播组的概念&#xff0c;每个组都有一个特别分配的…

基于Springboot实现垃圾分类网站管理系统项目【项目源码+论文说明】计算机毕业设计

基于Springboot实现垃圾分类网站管理系统演示 摘要 本论文主要论述了如何使用JAVA语言开发一个垃圾分类网站 &#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述垃…

2024王道考研计算机组成原理——计算机硬件的基础知识

计算机组成原理的基本概念 计算机硬件的针脚都是用来传递信息&#xff0c;传递数据用的&#xff1a; 服务程序包含一些调试程序&#xff1a; 计算机硬件的基本组成 控制器通过电信号来协调其他部件的工作&#xff0c;同时负责解析存储器里存放的程序指令&#xff0c;然后指挥…

95837-47-1,羧基衍生物ICG(indocyaninegreen)

Cypate是一种高效的光热转换化合物&#xff0c;是通过在ICG&#xff08;indocyanine green&#xff09;分子结构中引入羧基基团而得到的衍生物。与母体染料ICG相比&#xff0c;它具有更强的疏水性和更好的结构稳定性&#xff0c;这使得它在生物医学应用中具有更高的稳定性和更广…

PCL点云处理之移动最小二乘MLS的点云去噪与法线计算效果 (二百零九)

PCL点云处理之移动最小二乘MLS的点云去噪与法线计算效果 (二百零九) 一、算法介绍二、算法实现1.代码2.效果一、算法介绍 PCL提供的移动最小二乘MLS算法,可以对原始点云进行快速的去噪和法线计算,用于后续其他处理,这里是简单的代码实现,直接复制粘贴即可使用,邻域点的…

计算机毕业设计选题推荐-springboot 网上手机销售系统

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

element树形控件单选

需求功能&#xff1a; 1&#xff0c;element树形控件单选 2&#xff0c;双击节点编辑 <div style"height: calc(100% - 48px)"><el-scrollbar class"scrollbar-wrapper"><el-tree :data"treesObj" show-checkbox default-expan…

Springcloud笔记(1)-微服务和springcloud介绍

微服务简介 就是将一个大的应用&#xff0c;拆分成多个小的模块&#xff0c;每个模块都有自己的功能和职责&#xff0c;每个模块可以 进行交互&#xff0c;这就是微服务对于微服务&#xff0c;业界没有严格统一的定义&#xff0c;但是作为“微服务”这名词的发明人&#xff0c;…