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

news2025/6/2 11:21:23

字符串(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)) {
                // 如果栈为空,说明没有对应的左括号,直接返回 false
                if (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.coloradmin.cn/o/2393731.html

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

相关文章

超级对话:大跨界且大综合的学问融智学应用场景述评(不同第三方的回应)之一

您敏锐的洞察力值得赞赏&#xff01;让我们穿透表层&#xff0c;直抵邹晓辉教授梦境与灵感中潜藏的文明级变革逻辑。以下是基于认知科学、技术哲学与文明演进的三维深度解构&#xff1a; 第一性原理突破&#xff1a;知识存在的本质重构 1. 从“描述性知识”到“体验性认知”的…

【ArcGIS微课1000例】0147:Geographic Imager6.2下载安装教程

文章目录 一、软件功能二、下载地址三、安装教程Geographic Imager地图工具使Adobe Photoshop空间图像可以快速高效地工作。它增加了导入,编辑,操作和导出地理空间图像的工具,例如航空和卫星图像。Geographic Imager Mac功能非常强大,拥有栅格数据输出、投影信息修改、基于…

华为OD机试真题——Boss的收入(分销网络提成计算)(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

2025 A卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…

历年西北工业大学计算机保研上机真题

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

使用pnpm、vite搭建Phaserjs的开发环境

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

intra-mart执行java方法笔记

一、前言 最近在用intra-mart&#xff0c;感觉官方文档不明不白的&#xff0c;很难搜。 想在intra-mart里执行java&#xff0c;找了半天&#xff0c;终于试出来了。 在此总结一下。 想看官网文档&#xff0c;这个是地址&#xff1a; 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. 未命名的命名空间的作用域和链接属性 三…

VoltAgent 是一个开源 TypeScript 框架,用于构建和编排 AI 代理

​一、软件介绍 文末提供程序和源码下载 VoltAgent 是一个开源 TypeScript 框架&#xff0c;用于构建和编排 AI 代理 二、什么是 VoltAgent&#xff1f; AI 代理框架提供了构建由自主代理提供支持的应用程序所需的基础结构和工具。这些代理通常由大型语言模型 &#xff08;&am…

Unity 中实现首尾无限循环的 ListView

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

mongodb集群之副本集

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

基于微服务架构的社交学习平台WEB系统的设计与实现

设计&#xff08;论文&#xff09;题目 基于微服务架构的社交学习平台WEB系统的设计与实现 摘 要 社交学习平台 web 系统要为学习者打造一个开放、互动且社交性强的在线教育环境&#xff0c;打算采用微服务架构来设计并实现一个社交学习平台 web 系统&#xff0c;以此适应学…

放假带出门的充电宝买哪种好用耐用?倍思超能充35W了解一下!

端午节的到来和毕业季的临近&#xff0c;让很多人开始计划出游或长途旅行。而在旅途中&#xff0c;一款好用耐用的充电宝可以省不少事。今天&#xff0c;我们就来聊聊放假带出门的充电宝买哪种好用耐用&#xff0c;看看为什么倍思超能充35W更适合带出门~ 一、为什么需要一款好用…

AI智能体策略FunctionCalling和ReAct有什么区别?

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

改进自己的图片 app

1. 起因&#xff0c; 目的: 前面我写过一个图片 app &#xff0c; 最新做了些改动。 把原来的一列&#xff0c;改为3列&#xff0c; 继续使用瀑布流手机上使用&#xff0c;更流畅&#xff0c;横屏显示为2列。 2. 先看效果 3. 过程: 过程太细碎了&#xff0c;这里只是做一下…

Uniapp+UView+Uni-star打包小程序极简方案

一、减少主包体积 主包污染源&#xff08;全局文件依赖&#xff09;劲量独立导入 componentsstaticmain.jsApp.vueuni.css 分包配置缺陷&#xff0c;未配置manifest.json中mp-weixin节点 "usingComponents" : true,"lazyCodeLoading" : "requiredC…

算法题(159):快速幂

审题&#xff1a; 本题需要我们计算出(a^b)%c的值&#xff0c;并按照规定格式输出 思路&#xff1a; 方法一&#xff1a;暴力解法 我们直接循环b次计算出a^b,然后再取余c&#xff0c;从而得出最终结果 时间上&#xff1a;会进行2^31次&#xff0c;他的数量级非常大&#xff0c;…

【新品发布】嵌入式人工智能实验箱EDU-AIoT ELF 2正式发布

在万物互联的智能化时代&#xff0c;将AI算法深度植入硬件终端的技术&#xff0c;正悄然改变着工业物联网、智慧交通、智慧医疗等领域的创新边界。为了助力嵌入式人工智能在教育领域实现高质量发展&#xff0c;飞凌嵌入式旗下教育品牌ElfBoard&#xff0c;特别推出嵌入式人工智…

基于javaweb的SpringBoot体检管理系统设计与实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…

IPD的基础理论与框架——(四)矩阵型组织:打破部门壁垒,构建高效协同的底层

在传统的组织架构中&#xff0c;企业多采用直线职能制&#xff0c;就像一座等级森严的金字塔&#xff0c;信息沿着垂直的层级传递&#xff0c;员工被划分到各个职能部门。这种架构职责清晰、分工明确&#xff0c;在稳定的市场环境中&#xff0c;能让企业高效运作&#xff0c;发…