一起学数据结构和算法(三)| 字符串(线性结构)

字符串(String)

字符串是由字符组成的有限序列,在计算机中通常以字符数组形式存储,支持拼接、查找、替换等操作。


简介

字符串是计算机科学中最常用的数据类型之一,由一系列字符组成的有限序列。在大多数编程语言中,字符串被作为基本数据类型或者对象提供,用于表示文本。从本质上讲,字符串可以看作是一个数组,但与普通数组不同,字符串有特殊的属性和操作方法,更适合处理文本数据。在 Java 等现代编程语言中,字符串是不可变的对象,一旦创建,其内容不可被修改。

核心特性

  1. 不可变性:在 Java 中,字符串一旦创建,其值不可被修改
  2. 字符序列:由多个字符按顺序排列组成
  3. 索引访问:可以通过索引访问单个字符,索引从0开始
  4. 字符串池:Java 中常量字符串会被存储在字符串中以节省内存
  5. 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)

  1. 初始化一个空栈 stack
  2. 定义一个字典 mapping,用于记录右括号与左括号的对应关系
  3. 遍历字符串中的每一个字符:
    1. 如果是左括号,压入栈
    2. 如果是右括号:
      1. 如果栈为空,说明没有对应的左括号,返回 False
      2. 否则,弹出栈顶元素,比较是否是对应的左括号,不是则返回 False
  4. 遍历结束后,检查栈是否为空。如果栈为空,说明括号完全匹配,返回 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] 算法导航

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

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

相关文章

2025电工杯数学建模竞赛A题 光伏电站发电功率日前预测问题 保姆级教程讲解|模型讲解

完整内容请看文章最下面的推广群 2025电工杯数学建模竞赛 A题保姆级分析完整思路代码数据教学 2025电工杯 A题保姆级教程思路分析 DS数模-全国大学生电工数学建模&#xff08;电工杯&#xff09; A题保姆级教程思路分析 A题&#xff1a;光伏电站发电功率日前预测问题 下面我…

React Native 拼音及拼音首字母搜索组件开发

写在前面 “用户说找不到联系人&#xff1f;拼音搜索功能必须安排上&#xff01;” —— 当产品经理第N次提出这个需求时&#xff0c;我意识到需要开发一个强大的拼音搜索组件。本文将详细介绍如何开发一个支持拼音匹配、首字母搜索的React Native搜索组件&#xff0c;让你的应…

springboot--实战--大事件--用户接口开发

开发模式&环境搭建 开发模式&#xff1a; 前后端分离开发 前端程序员写前端页面&#xff0c;后端程序员写后端的接口&#xff0c;前端工程发送请求来访问后台&#xff0c;后台处理完请求后要给前端相应对应的数据。 还需要一套标准来约束即接口文档&#xff0c;在接口文…

html使用JS实现账号密码登录的简单案例

目录 案例需求 思路 错误案例及问题 修改思路 案例提供 所需要的组件 <input>标签&#xff0c;<button>标签&#xff0c;<script>标签 详情使用参考&#xff1a;HTML 教程 | 菜鸟教程 案例需求 编写一个程序&#xff0c;最多允许用户尝试登录 3 次。…

小米玄戒O1架构深度解析(一):十核异构设计与缓存层次详解

前言 这两天&#xff0c;小米的全新SOC玄戒O1横空出世&#xff0c;引发了科技数码圈的一次小地震&#xff0c;那么小米的这颗所谓的自研SOC&#xff0c;内部究竟有着什么不为人知的秘密呢&#xff1f;我们一起一探究竟。 目录 前言1 架构总览1.1 基本构成1.2 SLC缺席的原因探…

VSCode如何像Pycharm一样“““回车快速生成函数注释文档?如何设置文档的样式?autoDocstring如何设置自定义模板?

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 让VSCode拥有PyCharm级注释生成能力 📒🚀 实现方案🛠️ 备用方案📒 自定义注释文档格式样式 📒🔄 切换主流注释风格✨ 深度自定义模板🛠️ 类型提示与注释联动优化⚓️ 相关链接 ⚓️📖 介绍 📖 用PyCharm写P…

数据库的事务(Transaction)

在数据库中&#xff0c;事务&#xff08;Transaction&#xff09; 是保证数据操作一致性和完整性的核心机制。它通过一组原子性的操作单元&#xff0c;确保所有操作要么全部成功&#xff08;提交&#xff09;&#xff0c;要么全部失败&#xff08;回滚&#xff09;。以下是数据…

2025-05-27 Python深度学习7——损失函数和反向传播

文章目录 1 损失函数1.1 L1Loss1.2 MSELoss1.3 CrossEntropyLoss 2 反向传播 本文环境&#xff1a; Pycharm 2025.1Python 3.12.9Pytorch 2.6.0cu124 1 损失函数 ​ 损失函数 (loss function) 是将随机事件或其有关随机变量的取值映射为非负实数以表示该随机事件的"风险&…

python+tkinter实现GUI界面调用即梦AI文生图片API接口

背景 目前字节跳动公司提供了即梦AI的接口免费试用&#xff0c;但是并发量只有1&#xff0c;不过足够我们使用了。我这里想做个使用pythontkinter实现的GUI可视化界面客户端&#xff0c;这样就不用每次都登录官方网站去进行文生图片&#xff0c;当然文生视频&#xff0c;或者图…

#git 储藏库意外被清空 Error: bad index – Fatal: index file corrupt

问题&#xff1a;通常是由于 Git 的索引文件损坏导致 原因&#xff1a;系统崩溃或断电、硬盘故障、Git 操作错误等 方案&#xff1a;重建索引文件&#xff1a;将当前的索引文件重命名为其他名称或删除&#xff0c;比如 index.m&#xff0c;然后命令行重建索引&#xff0c;git…

GitLab 18.0 正式发布,15.0 将不再受技术支持,须升级【二】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 官网极狐…

车载网关策略 --- 车载网关通信故障处理机制深度解析

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…

Unity数字人开发笔记

开源工程地址&#xff1a;https://github.com/zhangliwei7758/unity-AI-Chat-Toolkit 先致敬zhangliwei7758&#xff0c;开放这个源码 一、建立工程 建立Unity工程&#xff08;UnityAiChat&#xff09;拖入Unity-AI-Chat-Toolkit.unitypackage打开chatSample工程&#xff0c;可…

Cherry Studio连接配置MCP服务器

之前写了一篇关于Cherry Studio的文章&#xff0c;不了解的可以先看一下 AI工具——Cherry Studio&#xff0c;搭建满血DeepSeek R1的AI对话客户端【硅基流动DeepSeek API】-CSDN博客 最近Cherry Studio更新了一个新功能&#xff1a;MCP服务器 在 v1.2.9 版本中&#xff0c;…

OpenSSH 服务配置与会话保活完全指南

一、/etc/ssh/sshd_config 配置机制 1. 配置文件基础 文件作用 OpenSSH 服务器 (sshd) 的主配置文件&#xff0c;控制连接、认证、端口转发等行为。 加载与生效 修改后需重启服务&#xff1a;sudo systemctl restart sshd # Systemd 系统 sudo service ssh restart # S…

阿里云国际版注册邮箱格式详解

“为什么我的阿里云国际版注册总提示邮箱无效&#xff1f;” 这是许多初次接触阿里云国际版&#xff08;Alibaba Cloud International&#xff09;的用户常遇到的困惑。随着全球化进程加速&#xff0c;越来越多的企业选择阿里云国际版部署海外业务&#xff0c;而注册环节中邮箱…

【IDEA问题】springboot本地启动应用报错:程序包不存在;找不到符号

问题&#xff1a; springboot本地启动应用报错&#xff1a; 程序包xxx不存在&#xff1b;找不到符号 解决方案&#xff1a; 1.确保用maven重新导入依赖 2.删除.idea文件夹 3.invalidate caches里&#xff0c;把能选择的都勾选上&#xff0c;然后清除缓存重启 4.再在上方工具栏…

FFmpeg 时间戳回绕处理:保障流媒体时间连续性的核心机制

FFmpeg 时间戳回绕处理&#xff1a;保障流媒体时间连续性的核心机制 一、回绕处理函数 /** * Wrap a given time stamp, if there is an indication for an overflow * * param st stream // 传入一个指向AVStream结构体的指针&#xff0c;代表流信息 * pa…

【b站计算机拓荒者】【2025】微信小程序开发教程 - chapter3 项目实践 -1 项目功能描述

1 项目功能描述 # 智慧社区-小程序-1 欢迎页-加载后端&#xff1a;动态变化-2 首页-轮播图&#xff1a;动态-公共栏&#xff1a;动态-信息采集&#xff0c;社区活动&#xff0c;人脸检测&#xff0c;语音识别&#xff0c;心率检测&#xff0c;积分商城-3 信息采集页面-采集人数…

5.27 day 30

知识点回顾&#xff1a; 导入官方库的三种手段导入自定义库/模块的方式导入库/模块的核心逻辑&#xff1a;找到根目录&#xff08;python解释器的目录和终端的目录不一致&#xff09; 作业&#xff1a;自己新建几个不同路径文件尝试下如何导入 一、导入官方库 我们复盘下学习py…