数组

大家好,我是老马。

今天我们一起来学习一下数组这种数据结构。

主要知识

数组需要拆分下面几个部分:

  1. 理论介绍

  2. 源码分析

  3. 数据结构实现?

  4. 题目练习(按照算法思想分类)

  5. 梳理对应的 sdk 包

  6. 应用实战

因为这个是 leetcode 系列,所以重点是 4、5(对4再一次总结)。

为了照顾没有基础的小伙伴,会简单介绍一下1的基础理论。

简单介绍1,重点为4。其他不是本系列的重点。

基础篇

数组-矩阵

字符串-字符串匹配

排序:计数+桶+基数

模拟

枚举

chat

详细介绍一下力扣基础之字符串

我们来系统讲解力扣(LeetCode)中关于基础算法技巧之字符串(String),包括:


一、字符串是什么?

在编程中,字符串 = 字符的序列,例如 "abc""leetcode",你可以把它看作一个字符数组。

  • Java:String, StringBuilder, char[]
  • Python:str, 可用切片操作
  • C++:string, char[]

二、力扣中字符串题的常见考点分类

我们可以把字符串题大致分为以下几类:


1. ✅ 字符串基础操作类

主要考察字符串遍历、拼接、反转、查找等基本操作。

📌 常见操作:

  • 遍历字符:for(char c : s.toCharArray())
  • 拼接字符串:用 StringBuilder
  • 截取子串:s.substring(i, j)
  • 比较字符串:equals() 而不是 ==

🎯 典型题目:


2. ✅ 双指针技巧类

用两个指针在字符串上滑动、查找子串、压缩等。

📌 常见问题:

  • 找最长无重复子串
  • 判断是否是回文
  • 最小覆盖子串

🎯 典型题目:


3. ✅ 模拟类(字符串变换)

根据题目描述“手搓”实现字符串变化过程。

📌 常见场景:

  • 加密解密(如 Zigzag)
  • 自定义解析(如表达式、路径)
  • 移除/插入字符、编辑操作

🎯 典型题目:


4. ✅ 哈希 / 频次数组类

利用字符的频率、映射表等快速判断两个字符串之间的关系。

📌 常见应用:

  • 判断两个字符串是否是变位词(异位词)
  • 字母统计、字符比较
  • 滑动窗口配合哈希表

🎯 典型题目:


5. ✅ KMP / Rabin-Karp 等高级匹配算法

用于高效查找子串,面试中常用于“字符串匹配引擎”的底层实现。

🎯 典型题目:

初学者建议掌握 KMP 理解原理、但不强求记住背板。


6. ✅ 动态规划类

通常出现在回文子串、编辑距离等需要“重复子问题”的场景。

🎯 典型题目:


三、字符串常用操作总结(Java 示例)

操作 示例
获取长度 s.length()
获取字符 s.charAt(i)
截取子串 s.substring(i, j)
转为数组 char[] cs = s.toCharArray()
替换字符 s.replace("a", "b")
去除前后空格 s.trim()
分割字符串 s.split(" ")

四、字符串题常见技巧总结

技巧 用法
双指针 左右移动处理子串、回文
滑动窗口 固定窗口 / 动态窗口统计
字符哈希表 判断是否匹配、记录频率
前缀和 / 差分 处理频率类题目
处理嵌套字符串(如解码)

五、刷题推荐路线(基础 → 提升)

✅ 入门(操作类):

✅ 进阶(滑动/哈希):

✅ 高阶(模拟 / 动态规划):


六、常见面试问题

问题 技巧
判断回文字符串 双指针
判断两个字符串是否是变位词 频次数组或排序
字符串中第一个不重复的字符 哈希表
字符串压缩或解码 栈 / 模拟

七、小结

字符串考点 说明
字符操作 字符遍历、拼接、截取
子串分析 子串枚举、匹配、滑窗
高频统计 哈希映射、频次数组
模拟执行 解码、编辑、压缩
回文分析 双指针、动态规划

如果你想,我可以: