04字符串算法/代码随想录

四、字符串

  1. 反转字符串

    力扣344

    在这里插入图片描述

    遇到数组双指针真是太好用了,左右指针不断逼近即可,代码也很简单

    class Solution {public void reverseString(char[] s) {int fast = s.length - 1;int slow = 0;while (slow <= fast) {char temp = s[fast];s[fast] = s[slow];s[slow] = temp;fast--;slow++;}}
    }
    
  2. 翻转字符串II

    力扣541

    在这里插入图片描述

    由于java中字符串是不可变的,所以需要创建一个数组来更改代码,然后就是双指针了,双指针在数组中移动变化真的特别好用。

    class Solution {public String reverseStr(String s, int k) {char[] re = s.toCharArray(); int n = s.length();for (int i = 0; i < n; i += 2 * k) {reverse(re, i, Math.min(i + k, n) - 1);}return new String(re);}public void reverse(char[] arr, int left, int right) {while (left <= right) {char temp = arr[left];arr[left] = arr[right];arr[right] = temp;left++;right--;}}
    }
    

    不要被两个条件个唬掉了,其实一个循环就能搞定,本质上就是剩下的数组不满2k个,那么就前面一半反转,唯一区别的就算可能不满一半,这里需要注意,获取的是数组的长度,而想改变数组的内容需要通过下标获取,所以记得下标和个数的转换。这里只要定义一个转换函数,就清晰了,主函数使用长度,方便区间的改变,传入参数减1就变成下标了(非常推荐这种做法,把长度和索引的逻辑区分开来,这样不会混乱)。接下来就算主函数的书写了,终止条件是数组的长度,每次加2k(也就是把两个条件合并在一起得出的结论),只需要传入函数生活判断,到底是i+k大还是n大,就可以完美解决两个条件。

  3. 反转字符串里的单词

    力扣151

    在这里插入图片描述

    • 常规思路是先去除头尾的空格,以及单词间重复的空格,然后对单词进行反转,再对整个字符串反转,注意java字符串不能改变,记得转换为数组。这里的时间复杂度是O(n),虽然看到while嵌套while,但不代表一定是O(n²),这里的想法比较巧妙,看到空格就删除空格,每次单词添加结束后再加空格即可,这样剩下了大量的时间。其实也就是双指针,快指针去删空格,慢指针等添加完单词再加空格

      class Solution {public String reverseWords(String s) {String sb = removeExtraSpaces(s);char[] chars = reserveEachWords(sb);reverseAll(chars); // 修改了这里return new String(chars);}public String removeExtraSpaces(String s) {StringBuilder sb = new StringBuilder();int n = s.length();int i = 0;while (i < n) {while (i < n && s.charAt(i) == ' ') i++;if (i >= n) break;if (sb.length() > 0) sb.append(' ');while (i < n && s.charAt(i) != ' ') sb.append(s.charAt(i++));}return sb.toString();}public char[] reserveEachWords(String s) {char[] sb = s.toCharArray();int start = 0;for (int i = 0; i < sb.length; i++) {if (sb[i] == ' ') {reverse(sb, start, i - 1);start = i + 1;}}reverse(sb, start, sb.length - 1);return sb;}private void reverse(char[] sb, int left, int right) {while (left < right) {char temp = sb[left];sb[left] = sb[right];sb[right] = temp;left++;right--;}}private void reverseAll(char[] sb) {reverse(sb, 0, sb.length - 1); }
      }
      
  4. 实现strStr

    力扣28

    在这里插入图片描述

    • 暴力没什么好说的,两层循环暴力查找

      class Solution 
      {public int strStr(String haystack, String needle) {int n = haystack.length();int m = needle.length();int i = 0;while (i <= n - m) {int t = 0;while (t < m && haystack.charAt(i + t) == needle.charAt(t)) {t++;}if (t == m) {return i;}i++;}return -1;}
      }
      
    • 典型的kmp算法,构建next数组,进行查询

      class Solution 
      {public int strStr(String haystack, String needle) {int[] next = new int[needle.length()];getNext(next, needle);int j = 0;for (int i = 0; i < haystack.length(); ++i) {while (j > 0 && haystack.charAt(i) != needle.charAt(j)) {j = next[j - 1];}if (haystack.charAt(i) == needle.charAt(j)) {j++;}if (j == needle.length())  {return i - needle.length() + 1;}}return -1;}public void getNext(int[] next, String s) {int j = 0;next[0] = 0;for (int i = 1; i < s.length(); ++i) {while (j > 0 && s.charAt(i) != s.charAt(j)) {j = next[j - 1];}if (s.charAt(i) == s.charAt(j)) {j++;} next[i] = j;}}
      }
      
    • 什么是kmp算法呢,我们叫被匹配的字符串叫模板串,要匹配的叫主串,当模板串匹配到几个主串的时候,但突然不一样了,像暴力算法O(mn)就要重新匹配,而kmp会根据对应next数组去进行跳转匹配。kmp算法的kmp是三位大佬的名字,其实就是一个结论,最长相同前缀后缀的值对应每一个模板串,但匹配到对用模板串一个字符的时候出现错误,根据这字符的前一个字符的最长相同前缀后缀值,把匹配的值跳转到对应的索引(就是前一个字符的最长相同前缀后缀值),这样就减少了重复匹配。后面难点就是在构建next数组,就算计算各个字符的最长相同前缀后缀值。在getNext函数中,j代表的是前缀值以及最长相同前缀后缀值,i代表的是后缀值。for循环面临两种情况,一个是前缀后缀相匹配,一个是不匹配,不匹配就跳转到前一个字符的最长相同前缀后缀值,正好对应了kmp算法思想,然后循环到索引为0位置(如果一直匹配不到),然后就把前一个字符的最长相同前缀后缀值赋值过来即可,然后给next数组赋值。如果匹配到了就+1,然后给next数组赋值

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

conda找不到对应版本的pytorch,就会自动下载cpu版本的

踩坑一&#xff1a; conda install pytorch2.0.1 torchvision0.15.2 torchaudio2.0.2 pytorch-cuda11.7 -c pytorch -c nvidia (本人的服务器支持的 且python3.8.20) 先nvidia-smi查看自己cuda支持的最高版本&#xff0c;然后去pytorch官网寻找对应的torch、torchaudio、to…

信息学科平台设计与实现:Spring Boot技术详解

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

二、应用层,《计算机网络(自顶向下方法 第7版,James F.Kurose,Keith W.Ross)》

文章目录 零、前言一、应用层协议原理1.1 网络应用的体系结构1.1.1 客户-服务器(C/S)体系结构1.1.2 对等体&#xff08;P2P&#xff09;体系结构1.1.3 C/S 和 P2P体系结构的混合体 1.2 进程通信1.2.1 问题1&#xff1a;对进程进行编址&#xff08;addressing&#xff09;&#…

Java面向对象 C语言字符串常量

1. &#xff08;1&#xff09;. package liujiawei;public class Phone {String brand;double price;public void call(){System.out.println("手机打电话");}public void play(){System.out.println("手机打游戏");} } public class phonetest {public…

【逆向基础】十八、PE文件格式(三)

一、简介 文本章主要讲结构体IMAGE_DATA_DIRECTORY数组。它制定了各种数据目录的地址与大&#xff1b;PE装载器可以通过这些信息准确加载PE文件所需的函数&#xff0c;资源等&#xff1b;此外&#xff0c;数据目录表也是设置钩子&#xff0c;注入等逆向的理论基础。所以学习这…

Session条件竞争--理论

条件竞争 多个线程同时访问一个共享变量或文件时&#xff0c;由于线程的执行顺序不符合预期而导致最后的执行结果不符合开发者的预期。 session session,被称为“会话控制”。Session对象存储特定用户会话所需的属性及配置信息。这样&#xff0c;当用户在应用程序的Web页之间…

Centos8安装软件失败更换镜像源

问题 在Centos 8上安装git&#xff0c;报错如下&#xff1a; sudo dnf install git -y Repository extras is listed more than once in the configuration CentOS Linux 8 - AppStream 0.0 B/s …

如何让网页中的图片不可下载,让文字不可选中/复制

使用css中的伪属性来完成这个操作. 效果展示 文字不可复制: 图中这几个中文字符无法被选中,双击前面这几个字也只能选中后面的英文内容,无法选中也就无法复制. 既然常规方式无法选中,那打开浏览器开发者工具总能复制吧! 我经常这样干, 但是很遗憾,页面检查中根本就没那些内容…

Linux 之 信号概念、进程、进程间通信、线程、线程同步

学习任务&#xff1a; 1、 信号&#xff1a;信号的分类、进程对信号的处理、向进程发送信号、信号掩码 2、 进程&#xff1a;进程与程序的概念、进程的内存布局、进程的虚拟地址空间、fork创建子进程、wait监视子进程 3、 学习进程间通信&#xff08;管道和FIFO、信号、消息队列…

Jmeter——结合Allure展示测试报告

在平时用jmeter做测试时&#xff0c;生成报告的模板&#xff0c;不是特别好。大家应该也知道allure报告&#xff0c;页面美观。 先来看效果图&#xff0c;报告首页&#xff0c;如下所示&#xff1a; 报告详情信息&#xff0c;如下所示&#xff1a; 运行run.py文件&#xff0c;…

ElasticSearch - Bucket Script 使用指南

文章目录 官方文档Bucket Script 官文1. 什么是 ElasticSearch 中的 Bucket Script&#xff1f;2. 适用场景3. Bucket Script 的基本结构4. 关键参数详解5. 示例官方示例&#xff1a;计算每月 T 恤销售额占总销售额的比率百分比示例计算&#xff1a;点击率 (CTR) 6. 注意事项与…

java、excel表格合并、指定单元格查找、合并文件夹

#创作灵感# 公司需求 记录工作内容 后端&#xff1a;JAVA、Solon、easyExcel、FastJson2 前端&#xff1a;vue2.js、js、HTML 模式1&#xff1a;合并文件夹 * 现有很多文件夹 想合并全部全部的文件夹的文件到一个文件夹内 * 每个部门发布的表格 合并全部的表格为方便操作 模…

【初阶数据结构篇】链式结构二叉树(二叉链)的实现(感受递归暴力美学)

文章目录 须知 &#x1f4ac; 欢迎讨论&#xff1a;如果你在学习过程中有任何问题或想法&#xff0c;欢迎在评论区留言&#xff0c;我们一起交流学习。你的支持是我继续创作的动力&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;觉得这篇文章对你有帮助吗&#xff1…

aws(学习笔记第十课) 对AWS的EBS如何备份(snapshot)以及使用snapshot恢复数据,AWS实例存储

aws(学习笔记第十课) 对AWS的EBS如何备份&#xff08;snapshot&#xff09;以及使用snapshot&#xff0c;AWS实例存储 学习内容&#xff1a; 对AWS的EBS如何备份AWS实例存储EBS和实例存储的不足 1. 对AWS的EBS如何备份&#xff08;snapshot&#xff09;以及使用snapshot恢复数…

适用于 c++ 的 wxWidgets框架源码编译SDK-windows篇

本文章记录了下载wxWidgets源码在windows 11上使用visual Studio 2022编译的全过程,讲的不详细请给我留言,让我知道错误并改进。 本教程是入门级。有更深入的交流可以留言给我。 如今互联网流行现在大家都忘记了这块桌面的开发,我认为桌面应用还是有用武之地,是WEB无法替代…

Pycharm贪吃蛇小游戏后续2

前文中我们提到用面向对象去编写贪吃蛇 目前功能实现贪吃蛇吃食物&#xff0c;身体加长&#xff0c;其次可以按下-&#xff08;键盘上右分大小写的-&#xff0c;不是数字的-&#xff09;来改变speed&#xff0c;终端可以看到速度&#xff0c;后续将陆续实现撞墙死亡&#xff0…

你丢失的数据,10款数据恢复软件帮你找!!

现实与虚拟的交错&#xff0c;互联网的进步&#xff0c;加大了我们之间交流的效率&#xff0c;而且便便捷了许许多多的事&#xff0c;比如信息保存&#xff1b;今天咱们来聊聊数据恢复这个话题。你是不是会一不小心删除了重要文件&#xff1f;硬盘出了问题&#xff0c;数据不见…

ArcGIS005:ArcMap常用操作101-150例动图演示

摘要&#xff1a;本文涵盖了GIS软件操作的多方面内容&#xff0c;包括地图文档的新建、打开、保存及版本兼容性处理&#xff1b;错误与警告的查阅及帮助文档的使用技巧&#xff1b;地图打印比例尺的调整与地图信息的完善&#xff1b;图层操作的撤销与恢复&#xff0c;界面元素的…

算法【Java】—— 动态规划之斐波那契数列模型

动态规划 动态规划的思路一共有五个步骤&#xff1a; 状态表示&#xff1a;由经验和题目要求得出&#xff0c;这个确实有点抽象&#xff0c;下面的题目会带大家慢慢感受状态标识状态转移方程初始化&#xff1a;避免越界访问 dp 表&#xff0c;所以在进行填表之前我们要预先填…

【学习】软件测试中的过程管理为何如此重要

在软件世界的繁华盛景之中&#xff0c;无数代码编织成了璀璨的星空&#xff0c;而每一颗闪烁的星点背后&#xff0c;都离不开精心的过程管理来确保其光华不减。正如一座摩天大楼需要稳固的地基与精细的设计图一样&#xff0c;软件的成功问世同样依赖于严谨、系统的流程管控。本…