一起学数据结构和算法(三)| 字符串(线性结构)
字符串(String)
字符串是由字符组成的有限序列,在计算机中通常以字符数组形式存储,支持拼接、查找、替换等操作。
简介
字符串是计算机科学中最常用的数据类型之一,由一系列字符组成的有限序列。在大多数编程语言中,字符串被作为基本数据类型或者对象提供,用于表示文本。从本质上讲,字符串可以看作是一个数组,但与普通数组不同,字符串有特殊的属性和操作方法,更适合处理文本数据。在 Java 等现代编程语言中,字符串是不可变的对象,一旦创建,其内容不可被修改。
核心特性
- 不可变性:在 Java 中,字符串一旦创建,其值不可被修改
- 字符序列:由多个字符按顺序排列组成
- 索引访问:可以通过索引访问单个字符,索引从0开始
- 字符串池:Java 中常量字符串会被存储在字符串中以节省内存
- Unicode支持:可以包含任何 Unicode 字符,支持多语言文本
基本操作
// 创建字符串
String greeting = "你好,世界!";
String name = new String("Java编程");// 字符串长度
int length = greeting.length(); // 6// 连接字符串
String message = greeting + " 欢迎学习" + name;
String sameMassage = greeting.concat(" 欢迎学习").concat(name);// 访问字符
char firstChar = greeting.charAt(0); // '你'// 获取子字符串
String subStr = greeting.substring(0, 2); // "你好"// 字符串比较
boolean isEqual = greeting.equals("你好,世界!"); // true
boolean ignoreCase = "Java".equalsIgnoreCase("java"); // true// 查找
int index = message.indexOf("欢迎"); // 返回"欢迎"在字符串中首次出现的索引
boolean contains = message.contains("Java"); // true// 替换
String newStr = greeting.replace('你', '我'); // "我好,世界!"// 分割
String[] parts = "苹果,香蕉,橙子".split(","); // ["苹果", "香蕉", "橙子"]// 转换大小写(仅适用于拉丁字母)
String upper = "hello".toUpperCase(); // "HELLO"
String lower = "HELLO".toLowerCase(); // "hello"// 去除首尾空白
String trimmed = " hello ".trim(); // "hello"
优缺点
优点
- 易用性:提供了丰富的 API 和操作方法,处理文本更方便
- 国际化支持:支持 Unicode 字符集,可以处理各种语言的文本
- 内存优化:字符串池机制减少内存使用
应用场景
- 文本处理:处理用户输入,配置文件、日志等
- 数据解析:解析 JSON、XML、CSV等格式的数据
- 自然语言处理:文本分析、情感分析、机器翻译等
- 网络通信:http 请求参数、URL处理、网络协议等
- 用户界面:文本显示、多语言支持等
扩展
StringBuilder、StringBuffer、String- String:不可变,适合作为常量使用
- StringBuilder:可变,非线程安全,适合单线程下频繁修改字符串
- StringBuffer:可变,线程安全,适合在多线程环境使用,但性能略低于 StringBuilder
热门题目
- 14. 最长公共前缀
- 20. 有效的括号
- 415. 字符串相加
20. 有效的括号
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
示例:
输入:s = “()”
输出:true
题解:
栈,后进先出(LIFO)
- 初始化一个空栈 stack
- 定义一个字典 mapping,用于记录右括号与左括号的对应关系
- 遍历字符串中的每一个字符:
- 如果是左括号,压入栈
- 如果是右括号:
- 如果栈为空,说明没有对应的左括号,返回 False
- 否则,弹出栈顶元素,比较是否是对应的左括号,不是则返回 False
- 遍历结束后,检查栈是否为空。如果栈为空,说明括号完全匹配,返回 True;反之说明有未匹配的左括号,返回 False
class Solution {public boolean isValid(String s) {// 使用 Deque 接口实现栈结构,效率优于 Stack 类Deque<Character> stack = new ArrayDeque<>();// 定义一个哈希表,用于存储右括号到左括号的映射Map<Character, Character> mapping = new HashMap<>();mapping.put(')', '(');mapping.put('}', '{');mapping.put(']', '[');// 遍历字符串中的每一个字符for (char c : s.toCharArray()) {// 如果当前字符是右括号if (mapping.containsKey(c)) {// 如果栈为空,说明没有对应的左括号,直接返回 falseif (stack.isEmpty()) {return false;}// 弹出栈顶元素,并与当前右括号对应的左括号比较char top = stack.pop();if (mapping.get(c) != top) {return false;}} else {// 如果是左括号,直接压入栈中stack.push(c);}}// 遍历结束,如果栈为空,说明所有括号都正确匹配return stack.isEmpty();}
}
参考资料
[1] Hello 算法
[2] 算法导航
相关文章:

一起学数据结构和算法(三)| 字符串(线性结构)
字符串(String) 字符串是由字符组成的有限序列,在计算机中通常以字符数组形式存储,支持拼接、查找、替换等操作。 简介 字符串是计算机科学中最常用的数据类型之一,由一系列字符组成的有限序列。在大多数编程语言中&…...
udp 传输实时性测量
UDP(用户数据报协议)是一种无连接的传输协议,适用于实时性要求较高的应用,如视频流、音频传输和游戏等。测量UDP传输的实时性可以通过多种工具和方法实现,以下是一些常见的方法和工具: 1. 使用 iperf 测试…...

超级对话:大跨界且大综合的学问融智学应用场景述评(不同第三方的回应)之一
您敏锐的洞察力值得赞赏!让我们穿透表层,直抵邹晓辉教授梦境与灵感中潜藏的文明级变革逻辑。以下是基于认知科学、技术哲学与文明演进的三维深度解构: 第一性原理突破:知识存在的本质重构 1. 从“描述性知识”到“体验性认知”的…...

【ArcGIS微课1000例】0147:Geographic Imager6.2下载安装教程
文章目录 一、软件功能二、下载地址三、安装教程Geographic Imager地图工具使Adobe Photoshop空间图像可以快速高效地工作。它增加了导入,编辑,操作和导出地理空间图像的工具,例如航空和卫星图像。Geographic Imager Mac功能非常强大,拥有栅格数据输出、投影信息修改、基于…...
Android 之 kotlin 语言学习笔记二(编码标准)
1、源文件命名 所有源文件都必须编码为 UTF-8。如果源文件只包含一个顶级类,则文件名应为该类的名称(区分大小写)加上 .kt 扩展名。如果源文件包含多个顶级声明,则应选择一个可描述文件内容的名称(采用 PascalCase 大…...

华为OD机试真题——Boss的收入(分销网络提成计算)(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
2025 A卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…...
微软云如何申请使用
微软云(Azure)新手“开荒”指南:5步搞定账户,直达云端! 还在为云计算的复杂门槛发愁吗?别担心!当全球83%的企业都在加速“上云”,微软智能云Azure凭借其在全球34个区域、200服务的庞…...

历年西北工业大学计算机保研上机真题
2025西北工业大学计算机保研上机真题 2024西北工业大学计算机保研上机真题 2023西北工业大学计算机保研上机真题 在线测评链接:https://pgcode.cn/school 计算整数乘积 题目描述 给定 n n n 组数,每组两个整数,输出这两个整数的乘积。 …...

使用pnpm、vite搭建Phaserjs的开发环境
首先,确保你已经安装了 Node.js 和 npm。然后按照以下步骤操作: 一、使用pnpm初始化一个新的 Vite 项目 pnpm create vite 输入名字 选择模板,这里我选择Vanilla,也可以选择其他的比如vue 选择语言 项目新建完成 二、安装相关依赖 进入项…...

intra-mart执行java方法笔记
一、前言 最近在用intra-mart,感觉官方文档不明不白的,很难搜。 想在intra-mart里执行java,找了半天,终于试出来了。 在此总结一下。 想看官网文档,这个是地址: https://document.intra-mart.jp/library…...

在 Vue 2中使用 dhtmlxGantt 7.1.13组件,并解决使用时遇到的问题汇总.“dhtmlx-gantt“: “^7.1.13“,
一、最终实现的结果gif展示 二、开发步骤简介 1、vue中引用甘特图包dhtmlx-gantt // 可根据项目版本载入适配的版本 npm install dhtmlx-gantt7.1.132、vue文件中引入 <script> import { gantt } from dhtmlx-gantt/codebase/dhtmlxgantt.js import dhtmlx-gantt/code…...

【C++高级主题】命令空间(三):未命名的命名空间
目录 一、未命名的命名空间的基本概念 1.1 定义与特点 1.2 基本语法 1.3 访问方式 1.4 未命名的命名空间的作用 二、未命名的命名空间与静态声明的比较 2.1 静态声明的作用 2.2 未命名的命名空间的优势 2.3 示例代码比较 2.4. 未命名的命名空间的作用域和链接属性 三…...
鸿蒙OSUniApp 开发支持图片和视频的多媒体展示组件#三方框架 #Uniapp
使用 UniApp 开发支持图片和视频的多媒体展示组件 前言 在现代移动应用中,图片和视频已成为内容展示的主流形式。一个优秀的多媒体展示组件不仅能提升用户体验,还能增强产品的互动性和视觉冲击力。随着鸿蒙(HarmonyOS)生态的不断…...

VoltAgent 是一个开源 TypeScript 框架,用于构建和编排 AI 代理
一、软件介绍 文末提供程序和源码下载 VoltAgent 是一个开源 TypeScript 框架,用于构建和编排 AI 代理 二、什么是 VoltAgent? AI 代理框架提供了构建由自主代理提供支持的应用程序所需的基础结构和工具。这些代理通常由大型语言模型 (&am…...
数据中台(大数据平台)之数据仓库建设
数据中台作为企业数据管理的核心枢纽,应支持并促进企业级数据仓库的建设,确保数据的有效整合、治理和高效应用。在建设数据仓库的过程中,设计和规划显得尤为重要,需要深入理解业务需求,制定合理的技术架构,…...
如何使用DeepSpeed来训练大模型
🔥 DeepSpeed是什么? DeepSpeed 是微软开源的一个 分布式训练加速库。 能帮助我们: 高效训练大模型(百亿、千亿参数规模) 节省显存、加速训练 支持 ZeRO 优化器、Offload、混合精度(FP16/BF16࿰…...
道可云人工智能每日资讯|《北京市人工智能赋能新型工业化行动方案(2025年)》发布
道可云人工智能&元宇宙每日简报(2025年5月28日)讯,今日人工智能&元宇宙新鲜事有: 河南:打造“AI智慧文旅”沉浸式体验新空间,推动5GAR/VR在文旅消费场景应用 近日,河南省人民政府办公…...

Unity 中实现首尾无限循环的 ListView
之前已经实现过: Unity 中实现可复用的 ListView-CSDN博客文章浏览阅读5.6k次,点赞2次,收藏27次。源码已放入我的 github,地址:Unity-ListView前言实现一个列表组件,表现方面最核心的部分就是重写布局&…...

mongodb集群之副本集
目录 1. 适用场景备份高可用性 2. 集群搭建如何搭建资源规划根据资源完成各节点conf文件的配置启动各个mongodb节点初始化集群信息 搭建实例Linux搭建实例(待定)Windows搭建实例 3. 副本集基础操作4.集群平滑升级 1. 适用场景 备份 1)服务器…...

基于微服务架构的社交学习平台WEB系统的设计与实现
设计(论文)题目 基于微服务架构的社交学习平台WEB系统的设计与实现 摘 要 社交学习平台 web 系统要为学习者打造一个开放、互动且社交性强的在线教育环境,打算采用微服务架构来设计并实现一个社交学习平台 web 系统,以此适应学…...
window10下docker方式安装dify步骤
window10下docker方式安装dify步骤(稳定后考虑部署至linux中) 教程:https://blog.csdn.net/qq_49035156/article/details/143264534 教程:https://blog.csdn.net/m0_51171437/article/details/146069890 0、资源要求 ---windows…...
Spark SQL进阶:解锁大数据处理的新姿势
目录 一、Spark SQL,为何进阶? 二、进阶特性深剖析 2.1 窗口函数:数据洞察的新视角 2.2 高级聚合:挖掘数据深度价值 2.3 自定义函数(UDF 和 UDTF):拓展功能边界 三、性能优化实战 3.1 数…...

放假带出门的充电宝买哪种好用耐用?倍思超能充35W了解一下!
端午节的到来和毕业季的临近,让很多人开始计划出游或长途旅行。而在旅途中,一款好用耐用的充电宝可以省不少事。今天,我们就来聊聊放假带出门的充电宝买哪种好用耐用,看看为什么倍思超能充35W更适合带出门~ 一、为什么需要一款好用…...
云原生DMZ架构实战:基于AWS CloudFormation的安全隔离区设计
在云时代,传统的DMZ(隔离区)概念已经演变为更加灵活和动态的架构。本文通过解析一个实际的AWS CloudFormation模板,展示如何在云原生环境中构建现代化的DMZ安全架构。 1. 云原生DMZ的核心理念 传统DMZ是网络中的"缓冲区",位于企业内网和外部网络之间。而在云环境…...
小工具合集
Freetool.tools - Overview Freetool.tools is a 100% free online utility website offering a wide range of handy tools for everyday tasks. It focuses on simplicity, instant access, and zero cost—no signup, ads, or paywalls. ✅ Key Features & Strengths …...

AI智能体策略FunctionCalling和ReAct有什么区别?
Dify 内置了两种 Agent 策略:Function Calling 和 ReAct,但二者有什么区别呢?在使用时又该如何选择呢?接下来我们一起来看。 1.Function Calling Function Call 会通过将用户指令映射到预定义函数或工具,LLM 先识别用…...

改进自己的图片 app
1. 起因, 目的: 前面我写过一个图片 app , 最新做了些改动。 把原来的一列,改为3列, 继续使用瀑布流手机上使用,更流畅,横屏显示为2列。 2. 先看效果 3. 过程: 过程太细碎了,这里只是做一下…...
docker不用dockerfile
好的!既然你不想使用 Dockerfile,我们就完全不写 Dockerfile,改用你 Leader 提到的思路: 用基础镜像启动一个容器 → 手动在容器里安装依赖和复制项目 → 保存为新镜像 这个方式更直观,就像“你进入容器自己配置环境&a…...

Uniapp+UView+Uni-star打包小程序极简方案
一、减少主包体积 主包污染源(全局文件依赖)劲量独立导入 componentsstaticmain.jsApp.vueuni.css 分包配置缺陷,未配置manifest.json中mp-weixin节点 "usingComponents" : true,"lazyCodeLoading" : "requiredC…...
深度学习篇---Pytorch框架下OC-SORT实现
下面将详细介绍如何基于 PyTorch 框架实现 OC-SORT(Observation-Centric SORT)算法。OC-SORT 是一种高性能的多目标跟踪算法,特别适用于复杂场景下的目标跟踪。我们将从算法原理到具体实现逐步展开。 1. 算法概述与核心原理 OC-SORT 在传统…...