Leetcode刷题-字符串详细总结(Java)

字符串

字符串可能在算法处理上面和数组是类似的,但是String和数组的数据结构还是有一些不一样的

1、反转字符串

344. 反转字符串 - 力扣(LeetCode)

双指针的经典应用,两个指针同时向中间移动

public void reverseString(char[] s) {for(int i = 0,j = s.length - 1; i < s.length/2; i++,j--){char tmp = s[i];s[i] = s[j];s[j] = tmp;}
}

2、反转字符串2

541. 反转字符串 II - 力扣(LeetCode)

在这里插入图片描述

  1. 这个题就是要求复杂一些,需要注意的就是不要上来用for循环就想着 i++。应该是i += 2k
  2. 每次只是反转i 到 i+k,可以单独写一个方法,注意一般编程语言中都是左闭右开的,所以是不包括 i+k的
  3. 但是需要有一个条件,if ( i+k < s.length ),不能超过数组长度了,这个if里判断的是最后剩余的部分是大于k的
  4. 如果不大于k的也需要被考虑到,所以在上面 if 的语句内需要加上一个continue
public String reverseStr(String s, int k) {char[] arr = s.toCharArray();				// 0.需要学会怎么将字符串转成数组for(int i = 0; i < arr.length; i += (2*k)){  // 1. 每隔 2k 个字符的前 k 个字符进行反转if(i + k <= arr.length){reverse(arr,i,i+k-1);  				// 2. 剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符continue;}reverse(arr,i,arr.length-1);  			// 3. 剩余字符少于 k 个,则将剩余字符全部反转}return new String(arr);
}
//对第i到第i+k进行反转
public void reverse(char[] s,int i,int j){for(int m = i,n = j; m < n; m++,n--){char tmp = s[m];s[m] = s[n];s[n] = tmp;}
}

3、翻转字符串⾥的单词(较为综合)

151. 反转字符串中的单词 - 力扣(LeetCode)

在这里插入图片描述

这个题复杂在,空格的位置是不确定的,单词的前面中间后面都可能有。但是我们最后的结果中不能包含额外空格

  1. 可以首先对整个字符串进行一次反转,这样单词的对应位置就是正确的了

  2. 之后再对每一个单词再进行单独的反转

  3. 需要注意的就是对空格的处理

    而对空格的处理,想到了之前总结数组部分中的,移动元素,这一个题,用双指针解决的问题

    但是在用双指针去移动元素的过程中,需要注意最后需要重新获取我们需要的部分,只要0-slow部分

class Solution {public String reverseWords(String s) {// 1.去除首尾以及中间多余空格char[] arr = s.toCharArray();arr = removeSpace(arr);// 2.反转整个字符串reverseString(arr, 0, arr.length - 1);// 3.反转各个单词reverseEachWord(arr);return new String(arr);    }//用 快慢指针 去除首尾以及中间多余空格,可参考数组元素移除的题解private char[] removeSpace(char[] arr) {int slow = 0;for(int fast = 0; fast < arr.length; fast++){if(arr[fast] != ' '){   //遇到非空格就处理,即删除所有空格。if(slow != 0)     //手动控制空格,给单词之间添加空格 slow != 0说明不是第一个单词,需要单词前添加空格arr[slow++] = ' '; while(fast < arr.length && arr[fast] != ' ')arr[slow++] = arr[fast++];}}//这里需要注意的是,最后需要重新获取我们需要的部分,只要0-slow部分char[] newChars = new char[slow];System.arraycopy(arr, 0, newChars, 0, slow);return newChars;}//双指针实现指定范围内字符串反转public void reverseString(char[] arr, int start, int end) {while (start < end) {char tmp = arr[start];arr[start] = arr[end];arr[end] = tmp;start++;end--;}}//单词反转private void reverseEachWord(char[] arr) {int start = 0;//end <= s.length() 这里的 = ,是为了让 end 永远指向单词末尾后一个位置,这样 reverse 的实参更好设置for (int end = 0; end <= arr.length; end++) {// end 每次到单词末尾后的空格或串尾,开始反转单词if (end == arr.length || arr[end] == ' ') {reverseString(arr, start, end - 1);start = end + 1;}}}}

4、KMP

目标是对目标文本串进行模式匹配,给定一个文本串和一个模式串,去寻找文本串中有无模式串出现

这里的关键是找到模式串的最长相等前后缀

模式串:aabaaf

那么a:0、aa:1、aab:0、aaba:1、aabaa:2、aabaaf:0

在这里插入图片描述

所以如果模式串aabaaf 的next数组,就是[0,1,0,1,2,0]

这就说明比如在匹配到模式串5位置,如果不匹配,就需要按照前面一个字符的next数组元素值,去跳到模式串的序号2的位置接替f位置

next数组构造过程

  • 需要两个指针:i 指向后缀末尾位置;j 指向前缀末尾位置,同时代表最长相等的前后缀长度

  • 首先初始化:

    1. 让 j = 0,此时next[0] = 0。j直接初始化为0,是因为它是前缀的一个末尾
    2. 而 i 的初始化是放在for循环中,for(int i = 1;i<长度;i++)
  • 如果i 和 j 不相等,那就需要让j 进行回退,是看它前一位的next数组元组,其实也就是类似在实际匹配过程中使用next数组一样

    但是不能一直回退,前提是j > 0

    回退是一个连续的过程,所以“前提是j > 0”,这个是while中,不是if中

  • 如果i 和 j 相等,让j++,同时更新next数组值,next[i] = j

private 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(j) != s.charAt(i)) j = next[j - 1];if (s.charAt(j) == s.charAt(i)) j++;next[i] = j; }
}

整体代码:

class Solution {//前缀表(不减一)Java实现public int strStr(String haystack, String needle) {if (needle.length() == 0) return 0;int[] next = new int[needle.length()];getNext(next, needle);int j = 0;for (int i = 0; i < haystack.length(); i++) {while (j > 0 && needle.charAt(j) != haystack.charAt(i)) j = next[j - 1];if (needle.charAt(j) == haystack.charAt(i)) j++;if (j == needle.length()) return i - needle.length() + 1;}return -1;}private 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(j) != s.charAt(i)) j = next[j - 1];if (s.charAt(j) == s.charAt(i)) j++;next[i] = j; }}
}

5、重复的子字符串

459. 重复的子字符串 - 力扣(LeetCode)

在这里插入图片描述

有两种思路:

  1. 比较巧的思路是,如果两个相同字符串s拼接起来,并移除第一个和最后一个字符。如果 s 是该字符串的子串,那么 s 就满足题目要求。[这个是可以证明的,不过比较难理解]

    ​ 下面代码的含义是:检查字符串 s 在自身重复连接后(即 s + s)中,从第二个 s 开始的位置是否不等于 s 字符串的长度。如果不相等,则返回 true,否则返回 false

    class Solution {public boolean repeatedSubstringPattern(String s) {return (s + s).indexOf(s, 1) != s.length(); //从索引位置 1 开始搜索。搜索第一个 s 出现的位置。这意味着它将忽略新字符串的第一个字符,从第二个字符开始搜索。如果在去除掉首元素后,去查找有无s这个子串,查找到的的起始位置是s.length(),那就说明这个是只能在后面拼接上的那个s匹配上,并不能靠中间部分匹配上}
    }
    
  2. 用kmp【这个方法暂时还未具体实践】

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

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

相关文章

扣子Coze插件教程:如何使用Coze IDE创建插件

&#x1f9d9;‍♂️ 诸位好&#xff0c;吾乃斜杠君&#xff0c;编程界之翘楚&#xff0c;代码之大师。算法如流水&#xff0c;逻辑如棋局。 &#x1f4dc; 吾之笔记&#xff0c;内含诸般技术之秘诀。吾欲以此笔记&#xff0c;传授编程之道&#xff0c;助汝解技术难题。 &#…

爬虫 BeautifulSoup模块

爬虫 BeautifulSoup模块 【一】介绍 【1】说明 BeautifulSoup库是python的一个第三方库&#xff0c;主要用于处理HTML和XML文档他提供了一些简单的、python式的函数来解析、导航、搜索以及修改分析树&#xff0c;使得从网页抓取的数据变得简单高效BeautifulSoup自动将输入文…

华大基因获证:氧化三甲胺检测试剂助力心血管疾病早期干预

近日&#xff0c;深圳华大基因股份有限公司旗下的全资子公司华大生物科技&#xff08;武汉&#xff09;有限公司获得两项医疗器械注册证&#xff08;注册号&#xff1a;鄂械注准20232404470和鄂械注准20232404469&#xff09;。该试剂是国内首个获批二类注册的&#xff0c;基于…

2024第十五届蓝桥杯 Java B组 填空题

声明&#xff1a;博主比较菜&#xff0c;以下均为个人想法。解决方法仅供参考。欢迎大家一起讨论交流&#xff01; 第一题&#xff1a; 题目&#xff1a; &#xff08;简洁版&#xff09;从小到大排列是20或24倍数的正整数&#xff0c;前10个数依次是&#xff1a;”20 24 40 …

Linux进阶篇:文件传输工具curl命令详解

文件传输工具Linux curl命令详解 一 curl命令介绍 在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具&#xff0c;可以说是一款很强大的http命令行工具。它支持文件的上传和下载&#xff0c;是综合传输工具&#xff0c;但按传统&#xff0c;习惯称url为下载工具。…

package.java文件的作用

你查看springboot的源码&#xff0c;有很多类都有这个文件&#xff0c;在idea不能创建&#xff0c;因为不支持这种命名&#xff0c;只能用记事本创建后复制都项目中。 主要应用是给类添加正常&#xff0c;或者把公用的注解都放到这里&#xff0c;常量不合适&#xff0c;作用范…

竞赛 基于CNN实现谣言检测 - python 深度学习 机器学习

文章目录 1 前言1.1 背景 2 数据集3 实现过程4 CNN网络实现5 模型训练部分6 模型评估7 预测结果8 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于CNN实现谣言检测 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&am…

欧姆龙61F系列液位开关使用教程(补水和排水)

欧姆龙61F系列液位开关使用教程(补水和排水) 本文以61F-LS-CP11-NRA型号的液位开关为例进行说明: 具体的选型文档可参考以下链接中的内容: OMRON欧姆龙-无浮标开关(紧凑插入型)61F-LS液位开关-选型样本说明 补水功能(供水) 如下图所示, 电机电源为3相AC220V; 控制电…

SSRF+Redis未授权getshell

SSRFRedis未授权getshell 1.前言 当一个网站具有ssrf漏洞&#xff0c;如果没有一些过滤措施&#xff0c;比如没过滤file协议&#xff0c;gophere协议&#xff0c;dict等协议&#xff0c;就会导致无法访问的内网服务器信息泄露&#xff0c;甚至可以让攻击者拿下内网服务器权限 …

Git分布式版本控制系统——Git常用命令(二)

五、Git常用命令————分支操作 同一个仓库可以有多个分支&#xff0c;各个分支相互独立&#xff0c;互不干扰 分支的相关命令&#xff0c;具体如下&#xff1a; git branch 查看分支 git branch [name] 创建分支&#x…

5. Mysql的binlog介绍

参考&#xff1a;InnoDB学习&#xff08;三&#xff09;之BinLog 1. BinLog介绍 BinLog又称为二进制日志&#xff0c;是MySQL服务层的数据日志&#xff0c;MySQL所有的存储引擎都支持BinLog。 BinLog记录了MySQL中的数据更新和可能导致数据更新的事件&#xff0c;可以用于主从…

轻量带屏解决方案之恒玄芯片移植案例

本文章基于恒玄科技BES2600W芯片的欧智通 Multi-modal V200Z-R开发板 &#xff0c;进行轻量带屏开发板的标准移植&#xff0c;开发了智能开关面板样例&#xff0c;同时实现了ace_engine_lite、arkui_ui_lite、aafwk_lite、appexecfwk_lite、HDF等部件基于OpenHarmony LiteOS-M内…

【联机不卡顿】幻兽帕鲁教你如何低成本0延迟畅玩 云服务器性价比选择方案 16G低至26/月

更新日期&#xff1a;4月14日&#xff08;腾讯云16G价格回调了&#xff01;京东云采购季持续进行&#xff09; 本文纯原创&#xff0c;侵权必究 《最新对比表》已更新在文章头部—腾讯云文档&#xff0c;文章具有时效性&#xff0c;请以腾讯文档为准&#xff01; 【腾讯文档实…

算法:位运算

算法&#xff1a;位运算 常见位运算操作基本题型模拟加法数字查找总结 常见位运算操作 在C/C中&#xff0c;有比较丰富的位运算操作符&#xff0c;常见的有&#xff1a; &&#xff1a;按位与 |&#xff1a;按位或 ~&#xff1a;按位取反 ^&#xff1a;按位异或 <<&a…

MySQ数据库: MySQL数据库的安装配置 ,图文步骤详细,一篇即可完成安装完成! MySQL数据库如何与客户端连接

LiuJinTao&#xff1a; 2024年4月14日 文章目录 MySQL的安装配置1. 下载2. 安装 三、 MySQL 启动与停止1. 第一种 方式&#xff1a;2. 第二种方式&#xff1a; 四、MySQL 客户端连接2. 方式二&#xff1a; MySQL的安装配置 1. 下载 官方下载网址&#xff1a;https://www.mysq…

代码随想录刷题随记21-回溯1

代码随想录刷题随记21-回溯1 回溯法解决的问题 回溯法&#xff0c;一般可以解决如下几种问题&#xff1a; 组合问题&#xff1a;N个数里面按一定规则找出k个数的集合 切割问题&#xff1a;一个字符串按一定规则有几种切割方式 子集问题&#xff1a;一个N个数的集合里有多少符…

可视化大屏C位图:​地理信息—地球焦点图

Hello&#xff0c;我是大千UI工场&#xff0c;本期可视化大屏的焦点图&#xff08;C位&#xff09;分享将地球作为焦点图的情形&#xff0c;欢迎友友们关注、评论&#xff0c;如果有订单可私信。 将地球作为可视化大屏焦点图可以有以下几个作用&#xff1a; 全球数据展示&…

蓝桥杯嵌入式(G431)备赛笔记——DMA+ADC(单通道+多通道)

单通道&#xff1a; 开启循环模式&#xff0c;两个参数设为word u32 adc_tick0; u32 r37_value0; u32 r38_value0; float r37_volt0; float r38_volt0;//DMAADCvoid DMA_ADC() {if(uwTick-adc_tick<100) return;adc_tick uwTick;HAL_ADC_Start_DMA(&hadc2, &r37_v…

Python学习笔记19 - 类与对象

类的创建 对象的创建 类属性、类方法、静态方法 动态绑定属性和方法 面向对象的三大特征 封装&#xff1a;提高程序的安全性 继承&#xff1a;提高代码的复用性 多态&#xff1a;提高程序的可扩展性和可维护性 类的常用的特殊属性 类的常用的特殊方法 –add–() –len–() –…

Java中创建多线程的方法

继承Thread类&#xff0c;对该类进行new一个实例&#xff0c;对实例调用start方法&#xff0c;重写run方法。 缺点&#xff1a;单继承&#xff0c;无法继承 public class myThread extends Thread {public static void main(String[] args) {myThread myThread new myThread()…