直通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)通常面试中很少出现

案例一

拓扑结构相同子树练习题
《直通BAT面试算法精讲--字符串(1)》
两种方法:
方法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)

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

案例二

词语变形练习题

两个字符串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))
    原文作者:Andyato0520
    原文地址: https://blog.csdn.net/yato0514/article/details/81072778
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞