北京7月暑假班第2次课:回文子串-kmp等若干问题的讨论邹博
50页1、回文子串-KMP等若干问题的讨论,邹博 2014年7月19日,2/40,字符串循环左移,给定一个字符串S0N-1,要求把S的前k个字符移动到S的尾部,如把字符串“abcdef”前面的2个字符a、b移动到字符串的尾部,得到新字符串“cdefab”:即字符串循环左移k。 算法要求: 时间复杂度为 O(n),空间复杂度为 O(1)。,3/40,问题分析,暴力移位法 每次循环左移1位,调用k次即可 时间复杂度O(kN),空间复杂度O(1) 三次拷贝 S0k T0k Sk+1N-1 S0N-k-1 T0k SN-kN-1 时间复杂度O(N),空间复杂度O(k),4/40,优雅一点的算法,(XY)=YX 如:abcdef X=ab X=ba Y=cdef Y=fedc (XY)=(bafedc)=cdefab 时间复杂度O(N),空间复杂度O(1),5/40,Code,6/40,字符串的全排列,给定字符串S0N-1,设计算法,枚举A的全排列。,7/40,递归算法,以字符串1234为例: 1 234 2 134 3 214 4 231,8/40,递归Code,9/40,如果字符有重复,去除重复字符的
2、递归算法 以字符1223为例: 1 223 2 123 3 221 带重复字符的全排列就是从第一个字符起每个数分别与它后面非重复出现的数字交换。 即:第i个数与第j个数交换时,要求i,j)中没有与第j个数相等的数。,10/40,有重复字符的递归,11/40,用空间换时间,如果是单字符,可以使用mark256 如果是整数,可以遍历整数得到最大值max和最小值min,使用markmax-min+1 如果是浮点数或者其他结构数据,用Hash(事实上,如果发现整数间变化太大,也应该考虑使用Hash;并且,可以认为整数情况是最朴素的Hash),12/40,全排列的非递归算法,起点:字典序最小的排列,例如12345 终点:字典序最大的排列,例如54321 过程:从当前排列生成字典序刚好比它大的下一个排列 如:21543的下一个排列是23145 如何计算?,13/40,21543的下一个排列的思考过程,逐位考察哪个能增大 一个数右面有比它大的数存在,它就能增大 那么最后一个能增大的数是x = 1 1应该增大到多少? 增大到它右面比它大的最小的数y = 3 应该变为23xxx 显然,xxx应由小到大排
3、:145 得到23145,14/40,整理成算法语言,步骤:后找、小大、交换、翻转 查找字符串中最后一个升序的位置i,即:SkSk+1(ki),SiSi+1; 查找Si+1N-1中比Ai大的最小值Sj; 交换Si,Sj; 翻转Si+1N-1 交换操作后,Si+1N-1一定是降序排列的 以926520为例,考察该算法的正确性。,15/40,非递归算法Code,16/40,几点说明,下一个排列算法能够天然的去除重复字符的问题 C+STL已经在Algorithm中集成了next_permutation 可以将给定在字符串A0N-1首先升序排序,然后依次调用next_permutation直到返回false,即完成了非递归的全排列算法。,17/40,求字符串的最长回文子串,回文子串的定义: 给定字符串str,若s同时满足以下条件: s是str的子串 s是回文串 则,s是str的回文子串。 该算法的要求,是求str中最长的那个回文子串。,18/40,解法1 枚举中心位置,int LongestPalindrome(const char *s, int n) int i, j, max; if (
4、s = 0 | n = 0) ,19/40,算法解析 step1预处理,因为回文串有奇数和偶数的不同。判断一个串是否是回文串,往往要分开编写,造成代码的拖沓。 一个简单的事实:长度为n的字符串,共有n-1个“邻接”,加上首字符的前面,和末字符的后面,更n+1的“空”(gap)。因此,字符串本身和gap一起,共有2n+1个,必定是奇数; abbc #a#b#b#c# aba #a#b#a# 因此,将待计算母串扩展成gap串,计算回文子串的过程中,只考虑奇数匹配即可。,20/40,数组int Psize,字符串12212321 S = “$#1#2#2#1#2#3#2#1#“; 用一个数组 Pi 来记录以字符Si为中心的最长回文子串向左/右扩张的长度(包括Si),比如S和P的对应关系: S # 1 # 2 # 2 # 1 # 2 # 3 # 2 # 1 # P 1 2 1 2 5 2 1 4 1 2 1 6 1 2 1 2 1 Pi-1正好是原字符串中回文串的总长度,21/40,分析算法核心,我们的任务:假定已经得到了前i个值,考察i+1如何计算 即:在P0.i-1已知的前提下,计算Pi的
《北京7月暑假班第2次课:回文子串-kmp等若干问题的讨论邹博》由会员san****019分享,可在线阅读,更多相关《北京7月暑假班第2次课:回文子串-kmp等若干问题的讨论邹博》请在金锄头文库上搜索。
高中化学实验方案的设计第一节制备实验方案设计
高中生物实验室配置
高中体育与健康课程田径必修模块单元教学方案
高中通用技术方案的构思方法-设计分析教案苏教版必修
高中生物室配置
高中信息技术网络技术应用选修模块教学评价方案
骆小学教师戏曲知识培训方案(I)
麻村小学阳光体育活动计划及实施方案
高桥小学幼小衔接活动方案
马摆小学控辍保学实施方案
金阳街道中心小学未成年人思想道德建设实施方案
龙扬小学第32个爱国卫生月活动方案
魏家井联小学度控辍保学工作方案
高区第九届初中骨干教师课堂教学能力展示活动
长沙县2018年度小学生课外阅读知识竞赛及书目
阳江中心小学一月一事之五月主题活动方案
长营小学校园体育活动实施方案
高考历史备考方案-陈军
高考语文第5课父亲课前预案苏教版选修现代散文选读
高考语文第9课铃兰花课前预案苏教版选修现代散文选读
2024-04-11 25页
2024-04-11 37页
2024-04-11 28页
2024-04-11 31页
2024-04-11 36页
2024-04-11 29页
2024-04-11 22页
2024-04-11 27页
2024-04-11 34页
2024-04-11 32页