算法精讲学习笔记 字符串

简介:

算法精讲课学习笔记  字符串

1.字符串题目的特点

(1)广泛性
字符串可以看做字符类型的数组,
很多题目与数组的排序、查找、调整都是有关的,解答时可以参考
另外很多其他类型的题目可以看做字符串类型的面试题
注意Java中String是不可变的,可以使用String Buffer,String Builder,以及toCharArray方法。

(2)需掌握的概念
回文
子串(连续)
子序列(不连续)
前缀树(Trie树)
后缀树和后缀数组
匹配 
字典序

(3)需掌握的操作

与数组有关的操作:增删改查
字符的替换
字符串的旋转等

2.字符串题目的常见类型

(1)规则判断类型

判断字符串是否符合整数规则
判断字符串是否符合浮点数规则
判断字符串是否符合回文规则等
等等

(2)数字运算

int和long类型表达整数范围有限,
经常用字符串实现大整数运算

使用字符串模拟大整数相关的加减乘除操作

(3)与数组操作有关的类型

数组有关的调整、排序等操作需要掌握
特别是快排的划分过程经常被考察,需要掌握和了解其改写

(4)字符计数

比如需要遍历一遍字符串,统计每种字符出现的次数。
可以使用哈希表处理;
也可以使用固定长度的数组解决;
在C/C++中字符的取值范围是0~255,在Java中是0~65535,
都可以使用固定长度的数组来代替哈希表进行字符统计,

常见的题目:
滑动窗口问题
寻找最长无重复子串问题
计算变位词问题

(5)动态规划类型

最长公共子串问题
最长公共子序列问题
最长回文子串问题
最长公共回文子串问题等

(6)搜索类型

比如给定两个字符串,String1每次只能变换一个位置的字符,如何通过一系列的变换,得到String2,打印变换轨迹。
这个实际上是搜索问题,
通常的解法有宽度优先搜索,和深度优先搜索。

(7)需要使用高级算法与数据结构解决的问题,很少出现

Manacher算法解决最长回文子串问题
KMP算法解决字符串匹配问题
前缀树结构
后缀树和后缀树组等
这些题目因为算法较为复杂,很少在面试中出现

3.拓扑结构相同的子树练习题

给定彼此独立的两棵树,头结点分别为t1和t2,判断t1中是否有与t2树拓扑结构完全相同的子树。

普通解法为二叉树遍历+匹配问题,最坏情况下时间复杂度为O(m*n)。
最优解法为二叉树序列化+KMP算法,
KMP算法的时间复杂度为O(m+n),因此这道题目可以做到O(m+n)。

4.变形词问题

给定连个字符串str1和str2,如果str1和str2中字符的种类都一样,并且每种字符出现的次数都一样,称为互为变形词。实现函数判断两个字符串是否为变形词。

使用哈希表算法解决。两个哈希表分别做字符计数,然后对比哈希表1和哈希表的记录是否一致。

同时可以用固定长度的数组代替哈希表结构,这道题的时间复杂度为O(N),额外空间复杂度也是O(N)。

5.旋转词问题

一个字符串str,把前面任意长度的部分字符串挪到后面而形成的字符串叫做str的旋转词,给定两个字符串,判定是否互为旋转词。
最优解的时间复杂度为O(N),即KMP算法。

策略如下:
首先判断str1和str2的长度是否相等,不相等直接返回false;
如果长度相等,生成str1+str1的大字符串;
用KMP算法判断大字符串中是否包含str2即可。

这里的大字符串,实际上穷举了所有的str1的旋转词。

 

6.给定一个字符串,请在单词间做逆序调整。

实现一个逆序函数。


7.字符串反转和手摇操作

给定一个字符串str,及一个整数i,i代表str中的位置,将str[0,i]移到右侧,str[i+1,n-1]移到左侧。
这里面包含了一个字符串问题中常用的方法,即通过几次字符数组的部分逆序调整,实现我们的调整需求。

8.字符串拼接字典序问题

给定一个字符串类型的数组strs,请找到一种拼接顺序,
使得所有字符串拼接起来的大字符串是所有拼接可能性的拼接方式中,字典序最小的,返回这个字符串。

9.空格替换问题

给定一个字符串str,将其中所有的空格换成“%20”,假设字符串后面有足够的空间。

先遍历一遍字符串,找到所有的空格数量,得到替换之后的字符串长度。

10.合法括号序列匹配问题

给定一个字符串str,判定是不是整体有效的括号字符串。


11.最长无重复子串问题

给定一个字符串str,返回str的最长无重复字符子串的长度。

 


本文转自邴越博客园博客,原文链接:http://www.cnblogs.com/binyue/p/5192280.html,如需转载请自行联系原作者

相关文章
|
算法
【算法】滑动窗口——找到字符串中所有字母异位词
【算法】滑动窗口——找到字符串中所有字母异位词
238 0
|
算法
两个字符串匹配出最长公共子序列算法
本文介绍了最长公共子序列(LCS)问题的算法实现,通过动态规划方法求解两个字符串的最长公共子序列,并提供了具体的编程实现细节和示例。
366 1
两个字符串匹配出最长公共子序列算法
|
自然语言处理 算法 搜索推荐
字符串相似度算法完全指南:编辑、令牌与序列三类算法的全面解析与深入分析
在自然语言处理领域,人们经常需要比较字符串,这些字符串可能是单词、句子、段落甚至是整个文档。如何快速判断两个单词或句子是否相似,或者相似度是好还是差。这类似于我们使用手机打错一个词,但手机会建议正确的词来修正它,那么这种如何判断字符串相似度呢?本文将详细介绍这个问题。
1048 1
|
数据采集 算法 JavaScript
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
JavaScript字符串搜索涵盖`indexOf`、`includes`及KMP算法。`indexOf`返回子字符串位置,`includes`检查是否包含子字符串。KMP是高效的搜索算法,尤其适合长模式匹配。示例展示了如何在数据采集(如网页爬虫)中使用这些方法,结合代理IP进行安全搜索。代码示例中,搜索百度新闻结果并检测是否含有特定字符串。学习这些技术能提升编程效率和性能。
434 1
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
|
算法 Java
掌握算法学习之字符串经典用法
文章总结了字符串在算法领域的经典用法,特别是通过双指针法来实现字符串的反转操作,并提供了LeetCode上相关题目的Java代码实现,强调了掌握这些技巧对于提升算法思维的重要性。
|
机器学习/深度学习 算法 BI
机器学习笔记(一) 感知机算法 之 原理篇
机器学习笔记(一) 感知机算法 之 原理篇
|
存储 算法 Cloud Native
C++ bcrypt算法 字符串加密,亲测有效
C++ bcrypt算法 字符串加密,亲测有效
|
存储 算法
算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离
算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离
算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离
|
算法
KPM算法求字符串的最小周期证明
公式 `ans = n - LPS[n-1]` 描述了最小周期,其中 `n` 是子串长度,`LPS[n-1]` 是前缀函数值。证明分为特殊情况和一般情况:对于完整周期字符串,`LPS[n-1] = 3*T`,故 `ans = T`;对于非完整周期,通过分析不同长度的 `[末部分]` 和 `[前部分]`,展示 `ans` 始终等于周期 `T` 或由 `[e][b]` 构成的最小周期,从而证明公式正确。
299 3
|
算法 C++
惊爆!KPM算法背后的秘密武器:一行代码揭秘字符串最小周期的终极奥义,让你秒变编程界周期大师!
【8月更文挑战第4天】字符串最小周期问题旨在找出字符串中最短重复子串的长度。KPM(实为KMP,Knuth-Morris-Pratt)算法,虽主要用于字符串匹配,但其生成的前缀函数(next数组)也可用于求解最小周期。核心思想是构建LPS数组,记录模式串中每个位置的最长相等前后缀长度。对于长度为n的字符串S,其最小周期T可通过公式ans = n - LPS[n-1]求得。通过分析周期字符串的特性,可证明该方法的有效性。提供的C++示例代码展示了如何计算给定字符串的最小周期,体现了KPM算法在解决此类问题上的高效性。
739 0

热门文章

最新文章