字符串(2)
案例1
题目:
普通解法为二叉树遍历+匹配问题
考察t1中以每个节点为头的子树是否与t2一致。
若T1节点数为N,T2为M。
普通解法的时间复杂度为O(N*M)
最优解为二叉树序列化+KMP算法
时间复杂度为O(N+M)
案例2
分析:使用哈希表做字符计数
案例3
一个字符串,其前面任意部分挪到后面去形成的字符串叫做str的旋转词。比如str=“1234”,旋转词有“1234”、“2341”、“3412”、“4123”。给定两个字符串a和b,请判断a和b是否互为旋转词。
例子:
a=“1ab2”,b=“ab12”,返回false。
a=“2ab1”,b=“ab12”,返回true。
分析:若字符串长度为N,其最优解时间复杂度为O(N).
1.判断str1与str2是否相等
2.若长度相等,生成srt1+str1的大字符串。
3.用KMP算法判断大字符串中是否含有str2。
案例4
字符串单词逆序
“pig loves dog”逆序成“dog loves pig”
方法:
1.实现将字符串局部所有字符逆序的函数f
即首尾依次调序
例:”abcdef”变为“fedcba”
2.利用f将字符串所有字符逆序
“god sevol gip”
3.找到逆序后的字符串中每一个单词的区域,利用f将每一个单词的区域逆序。
“dog loves pig”
案例5
给定一个字符串str,和一个整数i。i代表str中的位置,将str[0…i]移到右侧,str[i+1…N-1]移到左侧。
举例:str=“ABCDE”,i=2。将str调整为“DEABC”。
要求,时间复杂度为O(N),额外空间复杂度为O(1)。
分析:因为额外空间复杂度为O(1),所以不能申请额外数组来调整,只能在原数组上调整。
此类题目,大部分思路:活用局部逆序。
案例6
字符串拼接,寻找一种拼接顺序,使其字典顺序中最小,并返回这个大字符串。
举例:
[“abc”,“de”],拼接成“abcde”,也可拼接成“deabc”,但前者字典顺序更小,所以返回“abcde”
[“b”,“ba”],拼接成“bba”,也可拼接成“bab
”,但后者字典顺序更小,所以返回“bab”
分析:若字符串数组长度为N,最优解时间复杂度O(N*logN),思路:选择正确排序方式。
比较str1和str2是错的,例子2可以证明
正解:若str1+str2