LeetCode分类刷题----字符串篇

news2024/9/20 15:04:25

字符串

    • 字符串
      • 1.反转字符串
        • 344.反转字符串
        • 541.反转字符串||
      • 2.替换空格
        • 剑指offer05.替换空格
      • 3.翻转字符串里的单词
        • 151.反转字符串里的单词
      • 4.左旋转字符串
        • 剑指 Offer 58 - II. 左旋转字符串
      • 5.实现strStr函数()
        • 28.实现strStr()函数
      • 6.重复的子字符串
        • 459.重复的子字符串

字符串

1.反转字符串

344.反转字符串

在这里插入图片描述
思路:
用收尾两个指针,每次交换两个指针的值即可。

 public void reverseString(char[] s) {
          int left,right;
          for(left=0,right=s.length-1;left<s.length/2;left++,right--) {
        	  swap(left,right,s);
          }
	  }
	  /**
	   * 交换两个字符的值
	   * @param i
	   * @param j
	   * @param s
	   */
	 public void swap(int i,int j,char []s) {
		 char temp =s[i];
		 s[i]=s[j];
		 s[j]=temp;
	 }

541.反转字符串||

在这里插入图片描述
思路
让i的步长为2k,然后每次反转i,i+k区间的字符串即可。

class Solution {
    public static void reverseString(char[] s,int i,int j) {
         int left,right;
         for(left=i,right=j-1;left<right;left++,right--) {
       	  swap(left,right,s);
         }
	  }
	  /**
	   * 交换两个字符的值
	   * @param i
	   * @param j
	   * @param s
	   */
	 public static  void swap(int i,int j,char []s) {
		 char temp =s[i];
		 s[i]=s[j];
		 s[j]=temp;
	 }
	
	 public static String  reverseStr(String s, int k) {
		 char []array=s.toCharArray();
		 for(int i=0;i<s.length();i+=2*k) {
			 if((i+k)<s.length()) {
				reverseString(array, i, i+k);
				 continue;
			 }
			 reverseString(array, i, s.length());
		 }
		 return new String(array);

	   }
	 
	 public static void main(String[] args) {
		System.out.println(reverseStr("abcdefg",2));
	}
}

2.替换空格

剑指offer05.替换空格

在这里插入图片描述

思路:
双指针法,先统计空格的个数,然后给原字符串扩充空格*2的字符长度,然后left指针指向原字符串最后一个,right指针指向扩充后的字符串最后一个,当left指针遇到空格的时候,right指针存入%20即可,如果是正常字符则存入正常字符。

 public String replaceSpace(String s) {
		 StringBuilder str=new StringBuilder();
		 //如果碰到一个空格,给字符串扩充两个字符
		 for(int i=0;i<s.length();i++) {
			 if(s.charAt(i)==' ') {
				 str.append("  ");
			 }
		 }
		 if(str.length()==0) {
			 return s;
		 }
		 //左指针指向原字符串最后一个位置
		 int left=s.length()-1;
		 s+=str.toString();
		 int right=s.length()-1;
		 char []chars=s.toCharArray();
		 while(left>=0) {
			 if(chars[left]==' ') {
				 chars[right--]='0';
				 chars[right--]='2';
				 chars[right]='%';
			 }else {
				 chars[right]=chars[left];
			 }
			 right--;
			 left--;
		 }
        return new String(chars);
	    }

3.翻转字符串里的单词

151.反转字符串里的单词

在这里插入图片描述
思路:
先去除原字符串多余的空格。
用两个指针,快指针一直往后走,当它遇到不是空字符串的时候,就在慢指针里填充,注意每个单词之间要保证有一个空格。每次循环要保证填入一个单词。怎么保证呢,就是while(sArray[fast]!=’ ')
去除完空格之后字符串要整体翻转。
然后每个单词再单独反转(记录好出现空格的下标,每次反转就是start到字符串的下标即可)

 public static void reverseString(char[] s,int i,int j) {
         int left,right;
         for(left=i,right=j-1;left<right;left++,right--) {
       	  swap(left,right,s);
         }
	  }
	  /**
	   * 交换两个字符的值
	   * @param i
	   * @param j
	   * @param s
	   */
	 public static  void swap(int i,int j,char []s) {
		 char temp =s[i];
		 s[i]=s[j];
		 s[j]=temp;
	 }
	 public static String reverseWords(String s) {
		 //1.去除多余的空格
		  char []sArray=s.toCharArray();
		  int slow=0;
		  for(int fast=0;fast<sArray.length;fast++) {
			 
			  if(sArray[fast]!=' ') {
				  
				 if(slow!=0) {
					 sArray[slow++]=' ';
				 }
				 //当遇到空格的时候说明第一个单词结束,每次只会存入一个单词
				 while(fast<sArray.length&&sArray[fast]!=' ') {
					 sArray[slow++]=sArray[fast++];
				 }
			  }
		  }
		  //2.反转整个字符串
		  reverseString(sArray, 0, slow);
		  //3.对每个单词进行反转
		  int start=0;
		  for(int i=0;i<=slow;i++) {
			  if(i==slow||sArray[i]==' ') {
				  reverseString(sArray, start, i);
				  //记录好开始的下标
				  start=i+1;
			  }
			  
		  }
		  return new String(sArray).substring(0,slow);
		  
	    }

4.左旋转字符串

剑指 Offer 58 - II. 左旋转字符串

在这里插入图片描述
思路:
先翻转前n个字符串,然后反转剩下的字符串,最好来个统一字符串反转就ok了。空间复杂度为O(1)。

  public static void reverseString(char[] s,int i,int j) {
         int left,right;
         for(left=i,right=j-1;left<right;left++,right--) {
       	  swap(left,right,s);
         }
	  }
	  /**
	   * 交换两个字符的值
	   * @param i
	   * @param j
	   * @param s
	   */
	 public static  void swap(int i,int j,char []s) {
		 char temp =s[i];
		 s[i]=s[j];
		 s[j]=temp;
	 }
	  public String reverseLeftWords(String s, int n) {
		  
		  char[] charArray=s.toCharArray();
		  reverseString(charArray, 0, n);
		  reverseString(charArray, n, s.length());
		  reverseString(charArray, 0, s.length());
		  return new String(charArray);

	    }

5.实现strStr函数()

28.实现strStr()函数

在这里插入图片描述
思路:
这道题就是实现kmp算法。
那么kmp算法究竟是什么意思呢。我们通过对模式串进行处理,生成一个next数组。这样当字符串出现不匹配的时候,会根据next数组进行匹配,而不需要重头进行匹配了。
next里存的是什么呢?
里面存的是模式串到这个下标为止的最长相同子序列。这样后面匹配不成功的时候,我们可以直接移动到前边和后边一样的那个字符串那。
例如aabaaf的next数组就是010120。
不同书籍next数组给出了不同的定义,有的是将前缀表整体减1了。有的是将数组整体向右移动1位。第一个位置标记上-1了。
不管next数组怎么定义。里边的本质都是一样的。只是匹配的时候实现的细节不一样。
那么next数组怎么生成呢。我们用两个指针,第一个指针j指向前缀的末尾。i指向后缀的末尾。i一直向后移动。

  1. i和j指向的字符不相等时,j就一直往前走,如果一直不相等,直到变为0.
  2. i和j指向的字符相等,j++,然后next数组存j就可以了。
    为什么要参考j呢。因为j指向的字符也代表了以当前字符结尾的最长相同前缀,如果当前的相同和后面i指的也相同,那么自然可以++了。如果不相同j就被大会原位了。相当于在本串中又进行了一个模式匹配。

next数组生成完了,那么就可以进行字符匹配了。如果当前字符匹配不上,就根据next数组进行匹配。注意这个地方是while。因为可能也会出现next数组那个地方匹配不上的情况。如果字符匹配的 上,那么就可以一直++了。直到j等于模式串的长度就相当于匹配完成了。

 public int strStr(String haystack, String needle) {
		  //当needle为空串的时候直接返回0即可
		  if(needle.length()==0) {
			  return 0;
		  }
		  //初始化next数组
		  int []next=new int[needle.length()];
		  getNext(next,needle);
		  //j指针指向模式串
		  int j=-1;
		  for(int i=0;i<haystack.length();i++) {
			  //当模式串和文本串不相同的时候要根据next数组位置继续比较
			  while(j>=0&&haystack.charAt(i)!=needle.charAt(j+1)) {
				  j=next[j-1];
			  }
			  if(haystack.charAt(i)==needle.charAt(j+1)) {
				  j++;
			  }
			  //模式串匹配完成
			  if(j==(needle.length()-1)) {
				  return (i-needle.length()-1);
			  }
		  }
		  return -1;

	    }
	  //得到next数组
	  public void getNext(int[]next,String s) {
		  //i指针指向后缀末尾,j指针指向前缀末尾
		  int j=0;
		  next[0]=0;//第一个默认值是0
		  for(int i=1;i<s.length();i++) {
			  //当两个指针不相等的时候,j指针进行回退操作.
			  while(j>0&&s.charAt(i)!=s.charAt(j)) {
				 j=next[j-1];
			  }
			  if(s.charAt(i)==s.charAt(j)) {
				  j++;
				  next[i]=j;
			  }
		  }
	  }

6.重复的子字符串

459.重复的子字符串

在这里插入图片描述
思路:
将原来的字符串拼接起来,然后删去头一个字母和最后一个字母,判断剩下的字符串是否还包含原来的字符串,如果包含的话就符合题意,如果不包含就不符合题意。

 public boolean repeatedSubstringPattern(String s) {
		  String index=s+s;
		  return index.substring(1, index.length()-1).contains(s);
		  

	    }

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

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

相关文章

YOLOv1学习笔记

来源&#xff1a;投稿 作者&#xff1a;ΔU 编辑&#xff1a;学姐 论文笔记 《You Only Look Once:Unifified, Real-Time Object Detection》 Joseph Redmon∗ , Santosh Divvala∗†, Ross Girshick , Ali Farhadi∗† University of Washington∗ , Allen Institute for A…

【JavaGuide面试总结】计算机网络·上

【JavaGuide面试总结】计算机网络上1.OSI 七层模型是什么&#xff1f;每一层的作用是什么&#xff1f;2.TCP/IP 四层模型是什么&#xff1f;每一层的作用是什么&#xff1f;应用层传输层网络层网络接口层3.应用层有哪些常见的协议&#xff1f;4.为什么网络要分层&#xff1f;5.…

数据分析方法与模型

文章目录1 数据分析1.1 占比分析1.2 趋势分析1.3 对比分析1.4 象限分析1.5 排名分析1.6 维度分析2 分析模型2.1 费米问题-大致估算2.2 七问分析法-思考角度的拓展2.3 互联网通用模型AARRR、八角分析法2.3.1 AARRR2.3.2 游戏化用户增长策略-八角模型本文来源&#xff0c;为接地气…

基于RMI技术的数据库操作中间件设计 综合实践报告

前言 1.1 实践目的和要求 为了将理论用于实践,巩固所学知识,提高自己发现问题并用所学知识分析问题和解决问题的能力,锻炼自己的工作能力,适应社会能力,自我管理能力,了解目前软件的应用情况,需求情况,发展方向及前景。 要求&#xff1a; 要求在实习过程中认真学习技术知…

[疑难杂症2023-002]不就是Move一个文件吗,怎么会有这么多坑呢?

本文由Markdown语法编辑器编辑完成&#xff0e; 1. 前言: 近期在项目中遇到一个需求&#xff0e; 背景是&#xff0c;在一个QT封装的C/S架构的软件中&#xff0c;一个报告的预览页面&#xff0c;是由QT封装了QWebWidget, 里面放着一个网页&#xff0e;这个网页通过调用一定的…

论文解读 TOOD: Task-aligned One-stage Object Detection

github: https://github.com/fcjian/TOOD paper: https://arxiv.org/pdf/2108.07755.pdf 关键点 思考起点 指出传统one-stage算法在在优化目标分类和定位问题中的不足&#xff08;DecoupledHead分离了分类任务和回归任务[yolox表示解耦这是优点&#xff0c;yolo1-5都是使用y…

[oeasy]python0054_三引号_原样显示字符串_triple_quoted

三引号 回忆上次内容 \ 首先是转义字符 可以 和别的字符 构成转义序列 \a是 ␇ (bell),\b 退回一格\t 水平制表符\v、\f LineFeed\\ 输出 \\" 输出 "\ 输出 \xhh 通过 16 进制数值转义\nnn 通过 8 进制数值转义\ 还是 续行字符 放在 行尾可以让 下一行和本行 连成一…

Linux2

4.Linux的文件系统4.1.linux中所有的一切都是文件万事万物皆文件windows是盘符&#xff0c;linux是树windows是\&#xff08;翘&#xff09;linux是/4.2.查找文件方式&#xff1a;1. 绝对路径 有/2. 相对路径 4.3.挂载&#xff1a;执行挂载命令&#xff1a;mount 设备文件名 挂…

CentOS 安装 MinIO Server

1) 下载 MinIO 服务 wget https://dl.min.io/server/minio/release/linux-amd64/minio chmod x minio sudo mv minio /usr/local/bin/ 2) 创建systemd服务文件 sudo vim /etc/systemd/system/minio.service [Unit] DescriptionMinIO Documentationhttps:…

C语言文件操作(2) “流”的拓展介绍

tips 1. 打开一个文件 -> 内存里面就会创建一个对应关联的文件信息区 -> 文件信息区其实就是一个FILE类型的结构体 -> 各个结构体成员记录了该文件的种种信息 -> 结构体(文件信息区)由FILE* 结构体指针来维护 -> 有了指针&#xff0c;一切都好说了 2. 使用文…

文献阅读(45)——使用自监督学习对AMD分类

使用自监督学习对AMD分类 文章目录使用自监督学习对AMD分类一、简介二、先验知识三、文章核心内容四、使用方法1. 非参数化实例歧视&#xff08;中文翻译过来总是奇奇怪怪&#xff0c;其实就是NPID&#xff09;a 挑战b 解决方案c 转化&#xff01;2. 数据集3. 数据预处理五、结…

Python之拉盖尔多项式

文章目录拉盖尔多项式简介微分与积分求根和反演采样和拟合拉盖尔多项式简介 拉盖尔多项式是拉盖尔方程的标准解&#xff0c;但其更著名的应用是薛定谔方程在解氢原子的时候&#xff0c;其径向函数最后要乘上一个Ln−l−12l1(2rnaμ)L^{2l1}_{n-l-1}(\frac{2r}{na_\mu})Ln−l−…

TCP/IP应用层常见协议总结

TCP/IP应用层常见协议总结1.HTTP:超文本传输协议2.SMTP:简单邮件传输(发送)协议3.POP3/IMAP:邮件接收的协议4.FTP:文件传输协议5.Telnet:远程登陆协议6.SSH:安全的网络传输协议1.HTTP:超文本传输协议 超文本传输协议 主要是为 Web 浏览器与 Web 服务器之间的通信而设计的。当我…

浏览器的通信能力

用户代理 浏览器可以代替用户完成http请求&#xff0c;代替用户解析响应结果&#xff0c;所以我们称之为&#xff1a;用户代理 user agent 在网络层面&#xff0c;对于前端开发者&#xff0c;必须要知道浏览器拥有的两大核心能力 自动发出请求的能力自动解析响应的能力 自动…

『51单片机』串口通信配置

&#x1f6a9;write in front&#x1f6a9; &#x1f50e;大家好&#xff0c;我是謓泽&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f3c5;2021年度博客之星物联网与嵌入式开发TOP5&#xff5…

技术分享 | 黑盒测试方法论—因果图

因果图法是一种利用图解法分析输入与输出的各种组合情况&#xff0c;从而设计测试用例的方法&#xff0c;它适合于检查程序输入条件的各种组合情况。 因果图法比较适合输入条件比较多的情况&#xff0c;可以测试所有的输入条件的排列组合。因果图的 “ 因 ” 就是输入条件&…

Flutter滚动悬浮效果

有以下几种效果 1、tabBar透明度随偏移0-1渐变过度 2、app上下滚动触发tabBar同步滚动 3、tabBar切换触发app上下同步滚动 1、计算每个区块的高度 用keyList保存声明的key&#xff0c;用heightList保存每个key对应的组件高度 // key列表 List<GlobalKey> keyList [Gl…

lower_bound与upper_bound的应用

<1>lower_bound (1). . 上述代码返回在升序排序的序列a中第一个大于等于 t 的元素的地址. 示例: (2) 上述代码返回在升序排序的序列a中第一个大于等于 t 的元素的下标. 示例: 例题: P2249 【深基13.例1】查找 P2249 【深基13.例1】查找 - 洛谷 | 计算机科学教育新生…

JavaSE(多态、abstract、接口)

1.多态 多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c;具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会产生出不同 的状态。 向上转型 向上转型&#xff1a;实际就是创建一个子类对象&#xff0c;将其当成父类对象来使用。 语法格式&…

(牛客)小杜跑酷

链接&#xff1a;https://ac.nowcoder.com/acm/contest/49244/F?&headNavacm 来源&#xff1a;牛客网 题目描述 小杜又在玩游戏了&#xff01;这回他玩的是跑酷游戏&#xff01; 已知该跑酷地图长为n&#xff0c;有3层&#xff0c;可以理解为一张3n的地图。令人新奇的是&…