直通BAT面试算法精讲--字符串(1)

字符串面试题的特点:
1.广泛性
(1)字符串可以看做字符类型的数组,与数组排序、查找、调整有关
(2)很多其他类型的面试题可以看做字符串类型的面试题
2.需要掌握的概念
(1)回文
(2)子串(连续)
(3)子序列(不连续)
(4)前缀树(Trie树)
(5)后缀树和后缀数组
(6)匹配
(7)字典序
3.需掌握的操作:
(1)与数组相关的操作:增删改查
(2)字符的替换
(3)字符串的旋转

字符串题目的常见类型
1.规则判断:
(1)判断字符串是否符合整数规则
(2)判断字符串是否符合浮点数规则
(3)判断字符串是否符合回文字符串规则
2.数字运算
int和long类型表达范围有限,所以经常用字符串实现大整数
与大整数相关的加减乘除操作,需要模拟笔算的过程
3.与数组操作有关的类型
(1)数组相关的调整,排序等操作需要掌握
(2)快速排序的划分过程需要掌握和改写
4.字符计数
(1)哈希表
(2)固定长度的数组
(3)滑动窗口问题、寻找无重复字符子串问题,计算变位词问题
5.动态规划问题
(1)最长公共子串
(2)最长公共子序列
(3)最长回文子串
(4)最长回文子序列
6.搜索类型
(1)宽度优先搜索
(2)广度优先搜索
7.高级算法与数据结构解决的问题
(1)Manacher算法解决最长回文子串问题
(2)KMP算法解决字符串匹配问题
(3)前缀树问题
(4)后缀树和后缀数组
(5)通常面试中很少出现

案例一

拓扑结构相同子树练习题
这里写图片描述
两种方法:
方法1:
对于t1的每棵子树,都去判断是否与t2树的拓扑结构完全一样,这个过程的实践复杂度是O(M),t1的子树共有N棵,所以时间复杂度为O(M*N)
方法2:
首先把t1树和t2树按照先序遍历的方式序列化,之后用KMP算法去判断t2Str是否是t1Str的子串即可。t1的序列化的过程是O(N),t2的序列化是O(M),KMP算法解决匹配问题的复杂度是O(M+N),所以总体时间复杂度是O(M+N)

这里写图片描述

案例二

词语变形练习题

两个字符串str1和str2,如果str1和str2中出现的字符种类一样,且每种字符出现的次数一样,那么str1和str2互为变形词。

给定两个字符串以及他们的长度,请设计一个函数,返回一个bool值,代表他们是否互为变形词

测试用例:
str1=‘123’,str2=’231’,返回true
str1=’123’,str2=’2331’,返回false

解题思路:
使用固定长度的数组来存放每个字符串里面出现的次数,
对每个串进行计数,最后再比较是否相同

class Solution:
    def chkTransform(self,A,lena,B,lenb):
        dictA = self.countDict(A,lena)
        dictB = self.countDict(B,lenb)
        return dictA == dictB
    def countDict(self,A,lena):
        dictA = {}
        for i in range(lena):
            if A[i] not in dictA:
                dictA[A[i]] = 0
            dictA[A[i]] += 1
        print(dictA)
        return dictA
test = Solution()
A = '12314'
B = '231522'
lena = len(A)
lenb = len(B)
print(test.chkTransform(A,lena,B,lenb))

猜你喜欢

转载自blog.csdn.net/yato0514/article/details/81072778