字符串类型的算法面试

字符串类型的算法面试题特点
1. 广泛性
1.字符串可以看做字符类型的数组与数组排序、查找、调整有关
2.很多其它类型的面试题可以看做字符串类型的面试题
注意:用JAVA实现字符串类型的题目是,由于java.lang.String类型不可修改,我们可以使用StringBuffer,StringBuileder类和toCharArray方法。
2. 需掌握的概念
回文、字串(连续)、子序列(不连续)、前缀树(Trie树)、后缀树和后缀数组、匹配、字典序。
3. 需掌握的操作
与数组有关的操作:增删改查;字符的替换;字符串的旋转。
字符串题目的常见类型
1. 规则判断
1.判断字符串是否符合整数规则
2.判断字符串是否符合浮点数规则
3.判断字符串是否符合回文字符串规则
2. 数字运算
int和long类型表达整数范围有限,所以经常用字符串实现大整数
与大整数相关的加减乘除操作,需要模拟笔算的过程
3. 与数组操作有关的类型
1.数组有关的调整、排序等操作需要掌握
2.快排的划分过程需要掌握和改写
4. 字符计数
1.哈希表
2.固定长度的数组
c/c++(256长度)java(65536长度)
3.滑动窗口问题、寻找无重复字符字串问题、计算变位词为题
5. 动态规划类型
1.最长公共字串
2.最长公共子序列
3.最长回文字串
4.最长回文子序列
6. 搜索类型
1.宽度优先搜索
2.深度优先搜索
7. 高级算法与数据结构解决的问题
1.Manacher算法解决最长回文字串问题
2.KMP算法解决字符串匹配问题
3.前缀树结构
4.后缀树和后缀数组
题目一
给定彼此独立的两颗树头节点分别为t1和t2,判断t1中是否有与t2树拓扑结构完全相同的子树。
这里写图片描述
解法1:普通解法为二叉树遍历+匹配问题
考察t1中一每个节点为头的子树是否与t2一致 N代表t1节点 M代表t2节点
该算法的时间复杂度为O(N*M)
解法2:最优解法为二叉树序列化+KMP算法
时间复杂度为O(M+N)这里写图片描述

 **题目二**
给定两个字符串str1和str2,如果str1和str2中出现的字符串种类一样且每种字符出现的次数也一样,那么str1和str2互为变形词,请实现函数判断两个字符串是否互为变形词。
举例:
str1="123",str2="231".返回true
str1="123",str2="2331",返回false

解法:使用哈希表做字符计数 这里写图片描述
可以用固定长度的数组代替哈希表结构,时间复杂度为O(N),额外空间复杂度为O(N)
题目三
如果一个字符串str,把字符串str前面任意的部分挪到后面去形成的字符串叫做str的旋转词。比如str=”1234”,str的旋转词有”1234”,”2341”,”3412”,”4123”.给定两个字符串a和b,请判断a和b是否为旋转词。
最优解时间复杂度O(N):
1.判断str1与str2是否长度相等
2.如果长度相等,生成str1+str1的大字符串
3.用KMP算法判断大字符串中是否含有str2
举例说明:
str1 = “1 2 3 4”
str1 + str1 = “1 2 3 4 1 2 3 4”
如果str1长度为N,在str1 + str1的字符串中任意一个长度为N的字串都是str1的旋 转词。
题目四
给定一个字符串str,请在单词间做逆序调整。
举例:”pig loves dog”逆序成”dog loves pig”.
“I’m a student.” 逆序成”student. a I’m”.
解法:
1.实现将字符串局部所有字符逆序的函数f
2.利用f将字符串所有字符逆序
“pig loves dog” —> “god sevol gip”
3.找到逆序后的字符串中每一个单词的区域利用f将每一个单词的区域逆序
“god sevol gip” —>”dog loves pig”
题目五
给定一个字符串str,和一个整数i,i代表str中的位置,将str[0..i]移到右侧,str[i+1…N-1]移到左侧。
举例:str=”ABCDE”,i=2.将str调整为“DEABC”。要求,时间复杂度为O(N),额外空间复杂度为O(1)
解法:
1.将Str[0..i]部分的字符逆序
A B C D E
C B A D E
2.将str[i+1..N-1]部分的字符逆序
C B A D E
C B A E D
3.将str整体的字符逆序
C B A E D
D E A B C
题目六
给定一个字符串类型的数组strs,请找到一种拼接顺序,使得将所有字符串拼接起来组成的大字符串是所有可能性中字典顺序最小的,并返回这个大字符串。
举例:
strs = [“abc”,”de”].可以拼成”abcde”,也可以拼成”deabc”,但前者字典顺序更小,所以返回”abcde”.
解法:最优解的时间复杂度O(N*logN),其实质是一种排序的实现
方案一:根据单独每个字符串的字典顺序排序
[“abc”,”de”]—->[“abc”,”de”]
该方案是错误的,比如:
[“ba”,”b”]–>[“b”,”ba”]拼接后为“bba”
方案二:str1和str2按照如下方式比较。
如果str1 + str2 < str2+str1,则str1放在前面,否则,str2放再前面
题目七
给定一个字符串str,将其中所有空格字符替换成”%20”,假设str后面有足够的空间
该题目用java解决起来比较简单
题目八
给定一个字符串,判断是不是整体有效的括号字符串
1.整形变量num,代表’(‘出现次数与’)’出现次数的差值
2.遍历的过程中如果遇到’(‘,则num++
3.遍历的过程中如果遇到’)”,则num–
4.遍历的过程中如果num<0,则直接返回false
5.如果已没有出现情况4,则一直遍历下去。
6.遍历完成后,如果num==0,则返回true,否则返回false
题目九
给定一个字符串str,返回str的最长无重复字符字串的长度。
举例:str=”abcd”,返回4
str=”abcb”,最长无重复字符字串为”abc”,返回3
最优解时间复杂度O(N),额外空间复杂度O(N)
求出以str中每个字符结尾的情况下,最长无重复字符字串的长度,并在其中找出最大值返回。
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值