字符串高频面试题精讲PPT推荐.ppt
《字符串高频面试题精讲PPT推荐.ppt》由会员分享,可在线阅读,更多相关《字符串高频面试题精讲PPT推荐.ppt(17页珍藏版)》请在冰豆网上搜索。
nC/C+-128.+127,我们通常转化为unsigned变为0.+255nJava:
0.655353/面试题总体分析o和数组相关,内容广泛n概念理解:
字典序n简单操作:
插入、删除字符,旋转n规则判断(罗马数字转换是否是合法的整数、浮点数)n数字运算(大数加法、二进制加法)n排序、交换(partition过程)n字符计数(hash):
变位词n匹配(正则表达式、全串匹配、KMP、周期判断)n动态规划(LCS、编辑距离、最长回文子串)n搜索(单词变换、排列组合)4/例10-1交换o把一个0-1串(只包含0和1的串)进行排序,你可以交换任意两个位置,问最少交换的次数?
(国内某公司最新在线笔试题)n分析:
快排partition?
最左边的那些0和最右边的那些1都可以不管o000001.0111.1intanswer=0;
for(inti=0,j=len1;
ij;
+i,-j)for(;
(ii)&
(aj=1);
-j);
if(i=0;
-j)si-=sj;
if(sj=b)si-=b;
o思考题:
如何把字符串的空格变成”%20”?
同样,字符数组足够大!
7/例3交换星号o例3一个字符串只包含*和数字,请把它的*号都放开头。
n方法1快排partition数字相对顺序会变化o循环不变式:
0.i1都是*,i.j1是数字,j.n1未探测for(inti=0,j=0;
j=0;
-i)if(isdigit(si)sj-=si;
for(;
-j)sj=*;
10/例4子串变位词o给定两个串a和b,问b是否是a的子串的变位词。
例如输入a=hello,b=lel,lle,ello都是true,但是b=elo是false。
(国外某公司最新面试题)n滑动窗口的思想o动态维护一个“窗口”。
o比如b的长度是3,我们考察a0.2,1.3,2.4是否和b是变位词o如何与b比较?
11/例4续1o我们用一个hash,基于字符串的特殊性,我们可以用0.255或者0.65535的数组,我们暂且认为它们都是小写英文字母,用0.25来表示b中每个单词出现多少次。
o我们可以存一下有多少个非0次出现的,以后有用intnonZero=0;
for(inti=0;
ilenb;
+i)if(+numbia=1)+nonZero;
12/例4续2o我们用b中的次数减去a中一个“窗口”内的字符种类,如果结果全是0,则找到这样的子串了。
注意num的含义变为了字符种类差o第一个窗口0.lenb1(注意lenalenb无解)for(inti=0;
+i)intc=aia;
-numc;
if(numc=0)-nonZero;
elseif(numc=-1)+nonZero;
if(nonZero=0)returntrue;
13/例4续3o窗口如何滑动?
向右移动一位n新窗口ailenb+1.in旧窗口ailenb.i1o扔掉ailenbo加入aifor(inti=lenb;
ilena;
+i)intc=ailenba;
+numc;
if(numc=1)+nonZero;
elseif(numc=0)-nonZero;
c=aia;
o思考题Leetcode314/例5单词翻转o翻转句子中全部的单词,单词内容不变n例如Imastudent.变为student.aImnin-place翻转字符串第i位到第j位owhile(ij)swap(si+,sj-);
n有什么用?
o翻转整个句子:
.tnedutsamIo每个单词单独翻转:
student.aImn难点?
如何区分单词?
找空格,splitn思考题:
字符串循环移位abcdo移动1次变为bcdao移动2次变为cdabo移动3次变为dabco结论:
长度为n,移动m次,相当于移动m%n次n前m%n位翻转,后nm%n位翻转n总体再翻转一次试验一下?
15/总结o我理解的in-place(原地)n本身O
(1)空间n递归,堆栈空间可以不考虑o原地相关的问题n字符串循环左移、右移动n快排partition相关o滑动窗口o能达到O(n)的的时间复杂度oO
(1)的空间复杂度o规则相关细致o匹配(暴力):
KMP比较少见oManacher要求比较高的笔试16/谢谢大家o更多算法视频尽在:
nhttp:
/us:
微博n七月算法n七月问答n曹鹏博士17/