字符串面试题特点
1、广泛性
可以看作字符类型的数组与数组排序查找有关
2、很多类型面试题可以看作字符串类型面试题
JAVA实现时需要掌握StringBuffer,StringBuilder和toCharArray算法
了解概念
1.回文
2.子串(连续)
3.子序列(不连续)
4.前缀树(Trie树)
5.后缀树和后缀树组
6.匹配
7.字典序列
常见题目
1.规则判断
字符符串是否符合整数
字符串是否符合浮点型数
字符串是否满足回文
2.数字运算
字符串实现大整数的方式,模拟笔算过程
3.与数组操作有关的类型
4.字符技术
哈希表、固定长度的数组、滑动窗口、无重复子串、计算变位词等问题
5.动态规划最长XX问题
6.搜索类型
宽度、深度优先
7高级算法、数据结构
案例一
普通解法:
以每个节点为头的子树是否与t2一致
最优解二叉树序列化+kmp算法
案例二
哈希表做字符统计,比对每条记录是否一样,
也可以采用固定长度的数组来代替哈希表,更快更省空间
案例三
判断旋转词,abcd旋转词是abcd,bcda,cdab,dabc,
判断思路:str1(长度为n),str2
str1+str1=abcdabcd,这样该数组里长度为n的截取到的字符串就是str1的旋转次
案例四
给定字符串,在单词间做逆转
hello i am xiaoming => xiaoming am i hello
思路:首先先整体逆序,在逐个单词逆序
案例五
给定一个字符串str,和一个整数i。i代表str中的位置。将str[0…i]移到右侧,str[i+1…N-1]移到左侧,str=“ABCD”,i=2,将str调整为"DEABC",要求时间复杂度为O(N),额外空间复杂度为O(1)
思路:
str[i+1…N-1]逆序,str[0…i]逆序,str总体逆序
案例六
给定一个字符串类型的数组strs,请找到一种拼接顺序,使得将所有的字符串拼接起来组成的大字符串是所有可能性中字典顺序最小的并返回这个大字符串,最优解O(N*logN)
思路
如果str1+str2<str2+str1,则str1放在前面,单独比较两个字符串各自的字典顺序会有错误(如"ba"和"b")
案例七
假设str后面有足够的空间,将str里的所有空格字符替换成"%20"
思路:
1、先遍历字符串找到空格个数,算出后来的字符串长 i=原字符串长+2*空格数,字符串从后往前,从i-1处开始存放转换后结果,就不会将有用信息替换掉。
案例八
给定字符串str,str里只有左右括号() ,判断是否为整体有效的括号字符串,"(()())“为true,”())","()("为false。
思路:
最优解O(1)
1、整型变量num,代表"(“出现次数与”)"出现次数的差值,
2、遇到(,num++,遇到 )num–
3、若过程中出现num小于0,直接返回false
4、遍历完成后如果num==0则返回true,否则返回false
案例九
给定字符串str,返回str的最长无重复字符串子串长度"abc"返回3,"abcb"返回3。
思路:
最优解时间复杂空间复杂都为O(N)
从前往后求出以str每个字符结尾的情况下,最长无重复字符子串的长度,并找出其中最大值返回。
需要三个元素:
1、hash表,统计每个字符之前出现的位置
2、整型变量pre,代表以s[i-1]结尾的情况下,最长无重复字符子串长度
3、整型变量max,记录最大长度
map.get(“c”),求出c上次出现的位置
所以s[i]最长字符串不会超过s[i]到A
s[pre]代表以s[i-1]为结尾到达的最远位置
情况1,b在A的左侧
情况2,b在A的右侧
总结,谁靠右,谁就是最长无重复子串
操作:
1、hash表,"c"的位置在map中更新
2、整型变量pre,根据当前最长无重复子串的长度更新pre
3、更新max
利用当前规则计算位置i+1