【算法方法总结·四】字符串操作的一些技巧和注意事项

【算法方法总结·四】字符串操作的一些技巧和注意事项

  • 【算法方法总结·一】二分法的一些技巧和注意事项
  • 【算法方法总结·二】双指针的一些技巧和注意事项
  • 【算法方法总结·三】滑动窗口的一些技巧和注意事项
  • 【算法方法总结·四】字符串操作的一些技巧和注意事项

【字符串操作】

此章节涉及到以下 3 个问题

  • (1)API
  • (2)自定义方法
  • (3)字符串匹配

API

关于 String 的一些常用用法

String str = "abca";

// 1、字符串大小 length()
int len = str.length(); // 4

// 2、将字符串对象中的字符转换为一个字符数组 toCharArray()
char[] ss = str.toCharArray();
for (char c : str.toCharArray()){   
	System.out.print(c + " "); // 输出:a b c d 
}  

// 3、字符数组 -> 字符串 valueOf()
String s = String.valueOf(ss); // abcd

// 4、区分大小写 equals()
boolean isEqual1 = str.equals("abcA"); // false

// 5、不区分大小写 equalsIgnoreCase()
boolean isEqual2 = str.equalsIgnoreCase("AbcA"); // true

// 6、返回字符在字符串第一次出现的索引    
int idx1 = str.indexOf('a'); // 0

// 7、返回字符在字符串最后一次出现的索引
int idx2 = str.lastIndexOf('a'); // 3

// 8、从索引n开始截取后面所有的内容 substring(n)
String substr1 = str.substring(2); // ca

// 9、从索引i开始截取,到第n个字符[i,n) substring(i,n)
String substr2 = str.substring(1,3); // bc

// 10、转为大写
String upper = str.toUpperCase(); // ABCA

// 11、转为小写
String lower = str.toLowerCase(); // abca

// 12、拼接字符串
String newStr = str.concat("123"); // abca123 

// 13、用y替代x replace(x,y) 
String replaced = str.replace('a','z'); //zbcz 

// 14、分割字符串(某些字符需要转移) split() 
String splitStr = "a,b,c";
String[] parts = splitStr.split(","); // {"a","b","c"}

// 15、前者大,返回正,后者大,返回负,相等为0
str.compareTo() 

// 16、格式化字符串(与c语言类似)
str.format() 

// 17、移除字符串两端空白字符
str.trim() 

自定义方法

很多地方会 要求不能 使用 JavaAPI 函数,所以有些方法得会 自己写
例如 151.反转字符串中的单词

1.移除多余空格(首尾空格)

	// 1、移除多余空格 
    private StringBuilder reverseSpace(String s) {
        int start = 0;
        int end = s.length() - 1;
        while (s.charAt(start) == ' ') start++; // 移除串首空格
        while (s.charAt(end) == ' ') end--; // 移除串尾空格
        StringBuilder sb = new StringBuilder();
        while (start <= end) {
            char c = s.charAt(start);
            // 当前字符c与sb串尾字符不同时为' '时,加入sb
            if (c != ' ' || sb.charAt(sb.length() - 1) != ' ') {
                sb.append(c);
            }
            start++;
        }
        return sb;
    }

2.将整个字符串反转

	// 2、将整个字符串反转
    public void reverseString(StringBuilder sb, int start, int end) {
        while (start < end) {
            char t = sb.charAt(start);
            sb.setCharAt(start, sb.charAt(end));
            sb.setCharAt(end, t);
            start++;
            end--;
        }
    }

3.将每个单词反转

    private void reverseEachWord(StringBuilder sb) {
        int start = 0;
        int end = 1;
        int n = sb.length();
        while (start < n) {
            // 找到单词末尾的空格的索引end
            while (end < n && sb.charAt(end) != ' ') {
                end++;
            }
            // end-1为单词末尾的索引
            reverseString(sb, start, end - 1);
            start = end + 1;
            end = start + 1;
        }
    }

字符串匹配

KMP 算法

  • 当出现 字符串不匹配 时,可以知道一部分 之前已经匹配 的文本内容,可以利用这些信息避免从头再去 做匹配了

  • next 数组 就是一个前缀表,记录下标i之前(包括i)的字符串中,有多大长度相同前缀后缀

  • 前缀表 是用来 回退 的,它记录了 模式串主串(文本串) 不匹配的时候,模式串应该从哪里开始重新匹配


最长公共前后缀(这里用了 宫水三叶 的图便于理解)
  • 前缀是指不包含最后一个字符的所有以第一个字符开头的连续子串

  • 后缀是指不包含第一个字符的所有以最后一个字符结尾的连续子串

请添加图片描述
请添加图片描述

next 数组的构建
  • 前缀 是指 不包含最后一个字符 的所有以第一个字符开头的连续子串。
  • 后缀 是指 不包含第一个字符 的所有以最后一个字符结尾的连续子串。
  • next 数组有 很多种不同的写法,但只影响 其不匹配时 寻找 重新匹配位置 的方法
  • j 指向 前缀末尾 位置,i 指向 后缀末尾 位置
  • 在这里我采取了 next 和 前缀表 PM 相同的方法,在这种情况下,重新匹配位置 看前一个位置的 next 数组,如下图所示,j=1, i=2, s[j]!=s[i]时,需要重新匹配,j 要回退到前一个位置的 next 数组(即 next[j-1]
    在这里插入图片描述
// 得到 next数组,其实就是 PM 数组
public void getNext(int[] next, String s) {
	char[] ss = s.toCharArray(); 
	// j 指向前缀末尾位置,i 指向后缀末尾位置
    int j = 0;
    next[0] = 0; // 第一位为 0
    for(int i = 1; i < s.length(); i++) {
		// 不匹配时,循环回退 j 
        while(j > 0 && ss[i] != ss[j]){
            j = next[j - 1];
        }
        // 匹配时,j++,继续匹配
        if(ss[i] == ss[j]){
            j++;
        }
        // j 同时也指前后缀相等的个数
        next[i] = j;
    }
}

相关力扣题

  • 相关解法见【算法题解答·四】字符串操作

151.反转字符串中的单词

28.找出字符串中第一个匹配项的下标

459.重复的子字符串

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Halcon 算子 一维码检测识别、项目案例

首先我们要明白码的识别思路 把窗口全部关闭读取新的图片图像预处理创建条码模型设置模型参数搜索模型获取条码结果显示条码结果 图像预处理和条码增强 对比度太低&#xff1a; scale_image&#xff08;或使用外部程序scale_image_range&#xff09;,增强图像的对比度图像模糊…

STM32使用有源蜂鸣器

1.1 介绍&#xff1a; 有源蜂鸣器&#xff1a;内部自带振荡源&#xff0c;将正负极接上直流电压即可持续发声&#xff0c;频率固定 无源蜂鸣器&#xff1a;内部不带振荡源&#xff0c;需要控制器提供振荡脉冲才可发声&#xff0c;调整提供振荡脉冲的频率&#xff0c;可发出不同…

人工智能之数学基础:对线性代数中逆矩阵的思考?

本文重点 逆矩阵是线性代数中的一个重要概念,它在线性方程组、矩阵方程、动态系统、密码学、经济学和金融学以及计算机图形学等领域都有广泛的应用。通过了解逆矩阵的定义、性质、计算方法和应用,我们可以更好地理解和应用线性代数知识,解决各种实际问题。 关于逆矩阵的思…

数据仓库架构全解析:如何构建高效、有序的数据分层?

1.数仓架构规范 &#xff08;一&#xff09;分层架构规范 1.明确分层原则&#xff1a;通常遵循自下而上的 ODS&#xff08;操作数据存储层&#xff09;、DWD&#xff08;明细数据层&#xff09;、DWS&#xff08;汇总数据层&#xff09;、ADS&#xff08;应用数据层&#xff…

windows:curl: (60) schannel: SEC_E_UNTRUSTED_ROOT (0x80090325)

目录 1. git update-git-for-windows 报错2. 解决方案2.1. 更新 CA 证书库2.2. 使用 SSH 连接&#xff08;推荐&#xff09;2.3 禁用 SSL 验证&#xff08;不推荐&#xff09; 1. git update-git-for-windows 报错 LenovoLAPTOP-EQKBL89E MINGW64 /d/YHProjects/omni-channel-…

为何吹订单?因为特斯拉的销量已遥遥领先,掩耳盗铃之举!

从去年以来&#xff0c;多家新造车企业都经常拿大定、小定的数据来说事&#xff0c;而不是如之前说销量领先&#xff0c;原因就在于他们曾对标的特斯拉在销量方面已远远超越&#xff0c;在销量方面无法与特斯拉比拼&#xff0c;就只好用订单 国内媒体一片宣传特斯拉在中国的销量…

【智能体架构:Agent】LangChain智能体类型ReAct、Self-ASK的区别

1. 什么是智能体 将大语言模型作为一个推理引擎。给定一个任务&#xff0c; 智能体自动生成完成任务所需步骤&#xff0c; 执行相应动作&#xff08;例如选择并调用工具&#xff09;&#xff0c; 直到任务完成。 2. 先定义工具&#xff1a;Tools 可以是一个函数或三方 API也…

MC9S12单片机的内存映射机制

地址空间 这是个16位的单片机。CPU的寻址空间最大为2^1664K。 这个64K是包括外设、RAM、EEPROM、和FLASH的。现在程序越来越大&#xff0c;64K的空间肯定是不够用的。因此&#xff0c;需要扩展。 扩展方法就是&#xff1a;分页。 把原来的64K空间&#xff0c;划分一块出来&a…

C++ primier plus 函数探幽第二部分

系列文章目录 C primer plus 第一节 步入C-CSDN博客 C primer plus 第二节 hello world刨析-CSDN博客 C primer plus 第三节 数据处理-CSDN博客 C primer plus 第四节 复合类型-CSDN博客 C primer plus 第五节 循环-CSDN博客 C primier plus 第七节 函数探幽第一部分-CSDN博客 …

单细胞的一组基因或富集分数的高低表达分组差异分析作图教程

单细胞的一组基因或富集分数的高低表达分组计算差异分析和可视化教程 单细胞的一组基因或富集分数的高低表达分组计算 软件分析界面 运行结果 会得到一组基因或通路等富集分数的高低分组的seurat对象rds文件和meta.data文件 包含了指定的一组基因或富集分数的各自的高低表达分…

Qt之QGraphicsView图像操作

QGraphicsView图像操作:旋转、放大、缩小、移动、图层切换 1 摘要 GraphicsView框架结构主要包含三个主要的类QGraphicsScene(场景)、QGraphicsView(视图)、QGraphicsItem(图元)。QGraphicsScene本身不可见,是一个存储图元的容器,必须通过与之相连的QGraphicsView视图来显…

cSpell无法识别词语消除报错

VSCode extension: cSpell 使用VSCode时&#xff0c;cSpell可以帮助我们检查拼写错误。但是经常有一些单词会被误报&#xff0c;可以采取以下的方法解决。 1. 手动添加&#xff1a;将鼠标光标放在无法识别的词语上&#xff0c;左键点击Quick Fix&#xff0c;再次选择将未知词…

python的内置函数 - round()

知识点1 - round() 定义/功能 round() 是一个用于四舍五入的内置函数。它可以将一个浮点数或整数四舍五入到指定的小数位数。 知识点2 - round() 语法 round(number, ndigitsNone) number&#xff1a;需要四舍五入的数值&#xff08;可以是整数或浮点数&#xff09;。 nd…

SAP服务器进程预警通知

在财务月结&#xff0c;HR薪资核算等系统用户集中使用高峰时期。通过判断判断当前系统可用的并行对话框进程数&#xff0c;用户使用过多给出提示&#xff0c;服务器进程预警通知。 1. 根据配置的进程最大可使用率80%&#xff0c;根据进程数判断&#xff1a;当进程可用数少于20%…

无人机推流/RTMP视频推拉流:EasyDSS无法卸载软件的原因及解决方法

视频推拉流/直播点播EasyDSS平台支持音视频采集、视频推拉流、播放H.265编码视频、存储、分发等视频能力服务&#xff0c;在应用场景中可实现视频直播、点播、转码、管理、录像、检索、时移回看等。此外&#xff0c;平台还支持用户自行上传视频文件&#xff0c;也可将上传的点播…

【工具】ProToDeviseR一个自动化的蛋白质拓扑方案生成器

文章目录 介绍代码案例参考 介绍 氨基酸序列表征是几乎任何蛋白质分析的基本组成部分&#xff0c;创建简洁清晰的蛋白质拓扑结构在蛋白质组学研究中具有重要意义。尽管存在许多数据库和预测服务器&#xff0c;但是将来自各种资源&#xff08;有时是竞争资源&#xff09;的数据…

数据结构基础(一)

文章目录 1 数据结构基础1.1 什么是程序&#xff1f;1.2 数据、数据元素、数据项、数据对象1.3 基本的逻辑结构 2 算法效率2.1 时间复杂度2.1.1 循环执行次数2.1.2 大O(n)表示法 2.2 空间复杂度 1 数据结构基础 1.1 什么是程序&#xff1f; ​ 程序 数据结构 &#xff0b; 算…

taosd 写入与查询场景下压缩解压及加密解密的 CPU 占用分析

在当今大数据时代&#xff0c;时序数据库的应用越来越广泛&#xff0c;尤其是在物联网、工业监控、金融分析等领域。TDengine 作为一款高性能的时序数据库&#xff0c;凭借独特的存储架构和高效的压缩算法&#xff0c;在存储和查询效率上表现出色。然而&#xff0c;随着数据规模…

RangeError: Maximum call stack size exceeded

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 &#x1f35a; 蓝桥云课签约作者、…

《白帽子讲 Web 安全》之文件操作安全

目录 引言 &#xff08;一&#xff09;文件上传与下载漏洞概述 1.文件上传的常见安全隐患 1.1前端校验的脆弱性与服务端脚本执行危机在文件上传流程中&#xff0c;部分开发者可能会在前端使用 JavaScript 代码对文件后缀名进行简单校验&#xff0c;试图以此阻止非法文件上传…