1 字符串面试题的特点
广泛性
- 字符串可以看做字符类型的数组,与数组排序、查找、调整有关
- 很多其他类型的面试题可以看做字符串类型的面试题
使用Java实现字符串类型的题目时,要掌握StringBuffer、StringBuilder、toCharArray方法。
2 字符串题目的常见类型
规则判断
- 判断字符串是否符合整数规则
- 判断字符串是否符合浮点数规则
- 判断字符串时候符合回文字符串规则
数字运算
int和long类型表达整数范围有限,所以经常用字符串实现大整数。
与大整数相关的加减乘除操作,需要模拟笔算的过程。与数组操作有关的类型
- 数组有关的调整、排序等操作需要掌握
- 快速排序的划分过程需要掌握和改写
字符计数
- 哈希表
- 固定长度的数组 C/C++(256长度),Java(65535长度)
- 滑动窗口问题、寻找无重复字符子串问题、计算变位词问题
动态规划
- 最长公共子串
- 最长公共子序列
- 最长回文子串
- 最长回文子序列
搜索类型
- 宽度优先搜索
- 深度优先搜索
高级算法与数据结构解决的问题
- Manacher算法解决最长回文子串问题
- KMP算法解决字符串匹配问题
- 前缀树结构
- 后缀树和后缀数组
- 通常面试中很少出现
3 例题
例题1
普通解法
- 二叉树遍历 + 匹配问题
- 考察t1中以每个节点为头的子数是否与t2一致
- 假设t1树节点数为N,t2树节点数为M,最差时间复杂度为O(M*N)
最优解法
- 时间复杂度为O(M+N)
- t1序列化->字符串str1,t2序列化->字符串str2
- 使用KMP算法判断str1中是否含有str2
- 如果str1中包含str2,说明t1中有与t2相同的子树
- 否则说明没有
代码实现
|
|
例题2
普通方法
- 使用哈希表做字符统计
- str1 -> 字符统计 -> hash1
- str2 -> 字符统计 -> hash2
- 比对hash1与hash2的记录是否一致
其他方法
- 可以使用固定长度的数组来代理哈希表结构,时间复杂度为O(N),额外空间复杂度为O(N)
代码实现
|
|
例题3
- 最优解时间复杂度为O(N)
- 判断s1与s2是否长度相等
- 不等直接返回false
- 如果长度相等,生成s1+s1的大字符串
- 使用KMP算法判断大字符串中是否包含s2
- 如果包含则说明s1与s2互为旋转词
例题4
实现将字符串局部所有字符逆序的函数f
- 第i个字符和第n-i个字符交换顺序即可实现
利用f将字符串所有字符逆序
- 找到逆序后的字符串中每一个单词的区域,利用f将每一个单词区域逆序
|
|
例题5
- 先将str[0,i]逆序
- 再将str[i+1,n-1]逆序
- 将整个str逆序
代码实现
|
|
例题6
- 最优时间复杂度O(N*logN),其实质是一种排序的实现
代码实现
|
|
例题7
代码实现
|
|
例题8
代码实现
|
|
例题9
解法
代码实现
|
|