牛客网《BAT面试算法精品课》学习笔记
牛客网《BAT面试算法精品课》笔记一:排序
排序的详细实现:博客
牛客网《BAT面试算法精品课》笔记二:字符串
字符串Case:
Case1.
判断T2二叉树是否包含了T1
普通解法为二叉树遍历+匹配问题,考察t1中每个节点为头的子树是否与t2一致,时间复杂度为O(N*M),N代表t1节点数,M代表t2节点数。
但是这道题的最优解为O(M+N),将t1序列化为字符串str1,t2序列化为字符串str2,用KMP算法判断str1中是否含有str2
Case2.
给定两个字符串str1和str2,如果str1和str2中出现的字符种类一样且每种字符出现的次数也一样,那么str1与str2互为变形词,请实现函数判断两个字符是否互为变形词。
举例:
Str1=“123”,str2=“231”,返回true
Str1=“123”,str2=“2331”,返回false
可以使用哈希表做字符计数,两个 str生成两个哈希表,比较两个表的记录是否一致。也可以用固定长度的数组代替哈希表结构。
Case3.
给定一个字符串str,把字符串str前面任意的部分挪到后面去形成的字符串叫做str的旋转词。比如str=“1234”,str的旋转词有:“1234”,“2341”,“3412”,“4123”,给定两个字符串a和b,请判断a和b是否互为旋转词。
举例:
a=”cdab”,b=”abcd”,返回true
a=”1ab2”,b=”ab12”,返回false
本题最优解时间复杂度O(N)
首先判断str1与str2是否长度相等,如果长度相等,生成str1+str2的大字符串,用KMP算法判断大字符串中是否含有str2
举例说明:
str1=“1 2 3 4”
str1+str1=”1 2 3 4 1 2 3 4”
1234,2341,3412,4123都是它的旋转词
Case4.
给定一个字符串,请在单词间做逆序调整
举例:
“pig loves dog”逆序为“dog loves pig”
先写一个让所有字符逆序的函数f,用函数f将句子整体的字符逆序:“pig loves dog”变为“god sevol gip”,然后用f将每一个单词逆序,最后得到“dog loves pig”
Case5.
给定一个字符串str,和一个整数i,i代表str中的位置,将str[0..i]移到右侧,str[i+1..N-1]移到左侧
举例:
str=“ABCDE“,I=2,将str调整为”DEABC“
要求时间复杂度O(N),额外空间复杂度O(1)
因为有空间复杂度要求,所以不能开辟新数组,之能在原数组基础上操作。首先将str[0..i]部分的字符逆序ABCDE:CBADE,再将str[i+1..N-1]部分的字符逆序,CBADE:CBAED,最后将整个的字符逆序,CBAED:DEABC
Case6.
给定一个字符串类型的数组strs,请找到一种拼接顺序,使得所有的字符串拼接起来组成的大字符串是所有可能性中字典顺序最小的,并返回这个大字符串。
举例:
Strs=[“abc”,”de”],可以拼成“abcde“,也可以拼成”deabc“,但前者字典顺序更小,所以返回”abcde“
Strs=[“b”,”ba”],可以拼成“bba“,也可以拼成”bab“,但后者字典顺序更小,所以返回”bab“。
最优解的时间复杂度O(N*logN)
错误方案:根据单独每个字符串的字典顺序排序
正确方案:如果str1+str2<str2+str1,则str1放在前面,否则str2放在前面
Case7.
给定一个字符串str,将其中所有空格字符替换成“%20“,假设str后面有足够的空间。
Str=”a b c”
遍历str,发现空格数为2,所以在str替换后,长度为5+2*2=9
然后从后开始遍历str,将c放在第九个位置,结果为a%20b%20c
Case8.
给定一个字符串str,判断是不是整体有效的括号字符串
举例:
Str=”()”,返回true;str=“(()())“,返回true;str=”(())“,返回true;
Str=“())“,返回false;str=”()(“,返回false;str=”()a()“,返回false;
本题时间复杂度O(N),额外空间复杂度O(1)
01.整形变量num,代表’(’出现次数与‘)’出现次数的差值
02.遍历的过程,遇到‘(’,num++,遇到‘)’,num—
03.遍历的过程中如果num<0,则直接返回false
04.如果一直没出现03的情况,则一直遍历下去
05.遍历完成后,如果num==0,则返回true,否则返回false
Case9.
给定一个字符串str,返回str中的最长无重复字符子串的长度
举例:
str=”abcd”,返回4
str=“abcd”,最长无重复子串为“abc”,返回3
本题最优解时间复杂度为O(N),额外空间复杂度O(N).
求出以str中每个字符结尾的情况下,最长无重复字符子串的长度,并在其中找出最大值返回。思路:由于这个题目只要给出最长不重复子串的长度,所以代码比较简单。第一思路就是利用哈希表来进行操作。用字符当做键值,字符在串中的位置当做实值。用pre变量记录字符第一次出现的位置,最大长度max就是利用当前位置减去pre就是当前最大长度了。