最长回文子串

最长回文子串
最长回文子串

[转]最长回文子串O(n)

这个算法要解决的就是一个字符串中最长的回文子串有多长。这个算法可以在O(n)的时间复杂度内既线性时间复杂度的情况下,求出以每个字符为中心的最长回文有多长,

这个算法有一个很巧妙的地方,它把奇数的回文串和偶数的回文串统一起来考虑了。这一点一直是在做回文串问题中时比较烦的地方。这个算法还有一个很好的地方就是充分利用了字符匹配的特殊性,避免了大量不必要的重复匹配。

算法大致过程是这样。先在每两个相邻字符中间插入一个分隔符,当然这个分隔符要在原串中没有出现过。一般可以用‘#’分隔。这样就非常巧妙的将奇数长度回文串与偶数长度回文串统一起来考虑了(见下面的一个例子,回文串长度全为奇数了),然后用一个辅助数组P记录以每个字符为中心的最长回文串的信息。P[id]记录的是以字符str[id]为中心的最长回文串,当以str[id]为第一个字符,这个最长回文串向右延伸了P[id]个字符。

原串:waabwswfd

新串:# w # a # a # b # w # s # w # f # d #

辅助数组P: 1 2 1 2 3 2 1 2 1 2 1 4 1 2 1 2 1 2 1

这里有一个很好的性质,P[id]-1就是该回文子串在原串中的长度(包括‘#’)。

(证明:

1,显然l=2*p【i】-1即为新串中以s【i】为中心的最长回文串长度。

2,以s【i】为中心的回文串定以#开头和结尾,则l-1为原串长度的2 倍

证毕)

好,我们继续。现在的关键问题就在于怎么在O(n)时间复杂度内求出P数组了。只要把这个P数组求出来,最长回文子串就可以直接扫一遍得出来了。

由于这个算法是线性从前往后扫的。那么当我们准备求P[i]的时候,i以前的P[j]我们是已经得到了的。我们用mx记在i之前的回文串中,延伸至最右端的位置。同时用id这个变量记下取得这个最优mx时的id值。(注:为了防止字符比较的时候越界,我在这个加了‘#’的字符串之前还加了另一个特殊字符‘$’,故我的新串下标是从1开始的)

好,到这里,我们可以先贴一份代码了。

复制代码

1.

void pk()

{

int i;

int mx = 0;

int id;

for(i=1; i

{

if( mx > i )

p[i] = MIN( p[2*id-i], mx-i );

else

p[i] = 1;

for(; str[i+p[i]] == str[i-p[i]]; p[i]++)

;

if( p[i] + i > mx )

{

mx = p[i] + i;

id = i;

}

}

}

代码是不是很短啊,而且相当好写。很方便吧,还记得我上面说的这个算法避免了很多不必要的重复匹配吧。这是什么意思呢,其实这就是一句代码。

if( mx > i) p[i]=MIN( p[2*id-i], mx-i);

就是当前面比较的最远长度mx>i的时候,P[i]有一个最小值。这个算法的核心思想就在这里,为什么P数组满足这样一个性质呢? (下面的部分为图片形式)

最长公共子序列实验报告

河北地质大学课程设计报告 (学院)系: 信息工程学院 专业: 计算机科学与技术 姓名: 李义 班级: 二班 学号: 515109030227 指导教师: 王培崇 2016年11月26 日

算法课程设计报告 姓名李义学号515109030227 日期2016/11/10-2016/12/1 实验室152 指导教师王培崇设备编号08 设计题目求最长公共子序列 一、设计内容 求最长公共子序列,如输入字符串str1=adadsda,str2=sadasfda。 则求出的最长公共子序列是adasda。 二、设计目的 掌握动态规划思想,对使用求最长公共子序列加深理解。 三、设计过程 1.算法设计 1. for i ←0 to n 2. L[i,0] ←0 3. end for 4. for j ←0 to m 5. L[0,j] ←0 6. end for 7. for i ←1 to n 8. for j ←1 to m 9. if ai=bj then L[i,j]←L[i-1,j-1]+1 10. else L[i,j]←max {L[i,j-1], L[i-1,j] } 11. end if 12. end for 13. end for 14. return L[n,m] 2.流程图

开始结束 输入I=0,j=0 i<=n L[I,0]=0 i++ Y L[0,j]=0 N j<=n j++ Y i=1 to n J=1 to m ai=bj L[i,j]=L[i-1,j-1]+1 L[i,j]=max{L[i-1,j ],L[i,j-1]} Y J++i++ N 图1.Lcs 算法 3.数据结构 str1=adadsda str2=sadasfda 四、程序实现及运行结果

回文判断教学总结

实验报告 系部计算机系I班级I I学号I I姓名课程名称—数据结构I实验日期实验名称回文判断成绩 实验目的: 掌握栈的基本操作:入栈、出栈等在链式或顺序存储结构上的实现。 实验条件:PC机一台、VC++6.0编译环境 实验内容与算法思想: 内容: 输入一字符串判断其是否为回文。 算法思想: 1. 算法中主要用到的函数 ①void mai n() //主函数 ②int push_seqstack(Seqstack *s,char x) // 进栈 ③in t pop_seqstack(Seqstack *s) // 出栈 ④int gettop_seqstack(Seqstack *s) 〃取栈顶元素 ⑤int Ishuiwe n( char *s) 〃判断是否是回文 2. 函数之间的调用关系 函数之间的调用关系如图1所示:

图1函数之间的调用关系 运行结果: 运行程序输入一段字符串,运行不同的结果如图2、3所示: 图2 不是回文的判断结果 实验总结: 通过前两次的实验,使我对C语言和数据结构有许多认识。因此,这次实验 在做起来时多少有点思路,但是在实验室当中还是遇到了许多不会的问题,如回文的判断思路、以及函数的调用等等,不过这些问题在老师和同学的帮助下基本完成了这次实验。这次实验让我学到了很多知识,让我对原来所学的又重新复习了一遍,同时还学到了许多其他新知识。 附:源程序: #in clude #in clude #defi ne OK 1 #defi ne ERROR 0 #defi ne Maxsize 100 typedef struct { char elem[Maxsize]; int top; }Seqstack;

最长回文子串

[转]最长回文子串O(n) 这个算法要解决的就是一个字符串中最长的回文子串有多长。这个算法可以在O(n)的时间复杂度内既线性时间复杂度的情况下,求出以每个字符为中心的最长回文有多长, 这个算法有一个很巧妙的地方,它把奇数的回文串和偶数的回文串统一起来考虑了。这一点一直是在做回文串问题中时比较烦的地方。这个算法还有一个很好的地方就是充分利用了字符匹配的特殊性,避免了大量不必要的重复匹配。 算法大致过程是这样。先在每两个相邻字符中间插入一个分隔符,当然这个分隔符要在原串中没有出现过。一般可以用‘#’分隔。这样就非常巧妙的将奇数长度回文串与偶数长度回文串统一起来考虑了(见下面的一个例子,回文串长度全为奇数了),然后用一个辅助数组P记录以每个字符为中心的最长回文串的信息。P[id]记录的是以字符str[id]为中心的最长回文串,当以str[id]为第一个字符,这个最长回文串向右延伸了P[id]个字符。 原串:waabwswfd 新串:# w # a # a # b # w # s # w # f # d # 辅助数组P: 1 2 1 2 3 2 1 2 1 2 1 4 1 2 1 2 1 2 1 这里有一个很好的性质,P[id]-1就是该回文子串在原串中的长度(包括‘#’)。 (证明: 1,显然l=2*p【i】-1即为新串中以s【i】为中心的最长回文串长度。 2,以s【i】为中心的回文串定以#开头和结尾,则l-1为原串长度的2 倍 证毕) 好,我们继续。现在的关键问题就在于怎么在O(n)时间复杂度内求出P数组了。只要把这个P数组求出来,最长回文子串就可以直接扫一遍得出来了。 由于这个算法是线性从前往后扫的。那么当我们准备求P[i]的时候,i以前的P[j]我们是已经得到了的。我们用mx记在i之前的回文串中,延伸至最右端的位置。同时用id这个变量记下取得这个最优mx时的id值。(注:为了防止字符比较的时候越界,我在这个加了‘#’的字符串之前还加了另一个特殊字符‘$’,故我的新串下标是从1开始的) 好,到这里,我们可以先贴一份代码了。 复制代码 1. void pk() { int i; int mx = 0; int id; for(i=1; i i ) p[i] = MIN( p[2*id-i], mx-i ); else p[i] = 1; for(; str[i+p[i]] == str[i-p[i]]; p[i]++) ; if( p[i] + i > mx ) { mx = p[i] + i; id = i; } } } 代码是不是很短啊,而且相当好写。很方便吧,还记得我上面说的这个算法避免了很多不必要的重复匹配吧。这是什么意思呢,其实这就是一句代码。 if( mx > i) p[i]=MIN( p[2*id-i], mx-i); 就是当前面比较的最远长度mx>i的时候,P[i]有一个最小值。这个算法的核心思想就在这里,为什么P数组满足这样一个性质呢? (下面的部分为图片形式)

最长公共子序列实验报告

最长公共子序列问题 一.实验目的: 1.加深对最长公共子序列问题算法的理解,实现最长公共子序列问题的求解算法; 2.通过本次试验掌握将算法转换为上机操作; 3.加深对动态规划思想的理解,并利用其解决生活中的问题。 二.实验内容: 1.编写算法:实现两个字符串的最长公共子序列的求解; 2.将输入与输出数据保存在文件之中,包括运行时间和运行结果; 3.对实验结果进行分析。 三.实验操作: 1.最长公共子序列求解: 将两个字符串放到两个字符型数组中,characterString1和characterString2,当characterString1[m]= characterString2[m]时,找出这两个字符串m之前的最长公共子序列,然后在其尾部加上characterString1[m],即可得到最长公共子序列。当characterString1[m] ≠characterString2[m]时,需要解决两个子问题:即找出characterString1(m-1)和characterString2的一个最长公共子序列及characterString1和characterString2(m-1)的一个最长公共子序列,这两个公共子序列中较长者即为characterString1和characterString2的一个最长公共子序列。 2.动态规划算法的思想求解: 动态规划算法是自底向上的计算最优值。 计算最长公共子序列长度的动态规划算法LCS-Length以characterString1和characterString2作为输入,输出两个数组result和judge1,其中result存储最长公共子序列的长度,judge1记录指示result的值是由那个子问题解答得到的,最后将最终的最长公共子序列的长度记录到result中。 以LCS-Length计算得到的数组judge1可用于快速构造序列最长公共子序列。首先从judge1的最后开始,对judge1进行配对。当遇到“↖”时,表示最长公共子序列是由characterString1(i-1)和characterString2(j-1)的最长公共子序列在尾部加上characterString1(i)得到的子序列;当遇到“↑”时,表示最长公共子序列和characterString1(i-1)与characterString2(j)的最长公共子序列相同;当遇到“←”时,表示最长公共子序列和characterString1(i)与characterString2(j-1)的最长公共子序列相同。 如图所示:

回文串实验报告

回文串实验报告 课程名称:数据结构 实验名称:单链表 学生姓名:杜克强 学生学号: 201207092427

实验一回文串的基本操作及其应用 一、实验目的 1、掌握栈和队列的顺序存储结构和链式存储结构,以便在实际中灵活应用。 2、掌握栈和队列的特点,即后进先出和先进先出的原则。 3、掌握栈和队列的基本运算,如:入栈与出栈,入队与出队等运算在顺序 存储结构和链式存储结构上的实现。 二、实验内容和要求 [问题描述] 对于一个从键盘输入的字符串,判断其是否为回文。回文即正反序相同。如“abba”是回文,而“abab”不是回文。 [基本要求] (1)数据从键盘读入; (2)输出要判断的字符串; (3)利用栈的基本操作对给定的字符串判断其是否是回文,若是则输出“Yes”,否则输出“No”。 [测试数据] 由学生任意指定。 三、实验步骤 1.需求分析 本演示程序用C语言编写,完成对一个字符串是否是回文字符串的判断 ①输入一个任意的字符串; ②对输入的字符串进行判断是否为回文串;

③输出判断结果; ④测试数据: A.依次输入“abccba”,“asddas”等数据; B.输出判断结果“Yes”,“No”等 四、算法设计 1、算法思想: 把字符串中的字符逐个分别存储到队列和堆栈中,然后逐个出队和出栈并比较出队列的数据元素和退栈的数据元素是否相等,若相等则是会文,否则不是。 2、模块设计 (1)int Palindrome_Test()判断字符序列是否为回文串; (2)Status main()主函数; (3)Status CreatStack(SqStack &S)创建一个栈; (4)Status Push(SqStack &S,SElemType e)入栈; (5)Status Pop(SqStack &S ,SElemType &e)出栈; (6)Status CreatQueue(LinkQueue &Q)创建一个队列; (7)Status EnQueue(LinkQueue &Q,QElemType e)入队; (8)Status DeQueue(LinkQueue &Q,QElemType &e)出队;

数据结构C语言队列-回文

实验课题一:回文(palindrome)是指一个字符串从前面读和从后面读都一样,仅使用若干栈和队列、栈和队列的ADT函数以及若干个int类型和char类型的变量,设计一个算法来判断一个字符串是否为回文。假设字符串从标准输入设备一次读入一个字符,算法的输出结果为true或者false。 可以用一些字符串测试输出结果,如: "abcdeabcde","madamimadam" 等 #include #include #define m 100 typedef struct { char stack[m]; int top; }stackstru; typedef struct { char queue[m]; int front; int rear; }queuestru; void main() { int stinit(stackstru *s); //初始化顺序栈 int stempty(stackstru *s); //判断栈是否为空 int stpush(stackstru *s,char x); //入栈 char stpop(stackstru *s); //出栈 int quinit(queuestru *q); //初始化循环队列 int quempty(queuestru *q); //判断队列是否为空 int enqueue(queuestru *q,char e); //入队 char dequeue(queuestru *q); //出队 char c; int flag=0; stackstru *s=(stackstru *)malloc(sizeof(stackstru)); queuestru *q=(queuestru *)malloc(sizeof(queuestru)); stinit(s); quinit(q); printf("Input a string:\n");

2006级计算机科学系_程序设计_A卷

中山大学计算机科学系2006级 计算机科学与技术专业、网络工程专业、信息安全专业(ABCDE班) 程序设计 A卷 学号 ____________ 姓名 ______________ 成绩______________ (试卷共6页,答案全写在答题纸上,交卷时连试卷一同交回) 考试形式:闭卷任课老师:林瑛、肖菁、杨永红2007-6 《中山大学授予学士学位工作细则》第六条:“考试作弊不授予学士学位。” 一、单项选择(每小题1分,共15分) 1.C++语言新引入了在一种C语言中没有的参数传递方式是: A) 按指针调用B) 按名调用C) 按值调用D) 按引用调用 2.在C++语言中,以下哪个表达式采用了八进制表示整型常量: A) k=0123; B) k=123; C) k=’\x23’; D) k=0x123; 3.下面对结构或类中成员的访问不正确的是: A). *p.salary B) p->salary (p为指向类对象的指针) (p为指向类对象的指针) C) (*p).salary D) Worker.salary (p为指向类对象的指针) (Worker是类类型的对象) 4.类A中有一成员函数说明如下void A::Set(A & a); 其中A & a的含义是: A) 指向类A的指针为a B) 变量A与a按位与作为函数Set()的参数 C) 将a的地址值赋给变量Set D) a是类A的对象引用,用作函数Set()的形参 5.假定一个类有两个数据成员a和b,其构造函数为: A(int aa=1,int bb=0){ a = aa; b = bb; } 则执行语句A x(4); 后,x.a和x.b值分别是: A) 1和0 B) 1和4 C) 4和0 D) 4和1 6.可以用友元方式重载的运算符是: A) + :: << B) = >> / C) + & [] D) + || ! 7.设有如下声明的类: class FOO { private: static float std; float max, min; }; 则表达式sizeof(FOO)的值为: A) 4 B) 8 C) 12 D) 16 8.若在一个类中用成员函数重载了某种二元运算符@,而obj1和obj2都是该类的对象,则表达式 obj1@obj2 被C++编译器解释为: A) obj1.operator@(obj2) B) obj2.operator@(obj1) C) operator@(obj1,obj2) D) operator@(obj2,obj1) 9.下列函数中,不能重载的是: A) 类的成员函数B) 非成员函数C) 析构函数D) 构造函数 10.关于构造函数不正确的说法是: A) 构造函数可以有返回值B) 一个类可以有多个构造函数 C) 构造函数名与类名相同D) 构造函数初始化时为对象开辟一个内存

第4章串 作业(参考答案)

第四章串作业 参考答案: 1、简述空串和空格串(或称空格符串)的区别? 1)空串是指不包括任何字符的串,空格串指包含若干个空格字符的字符串; 2)空串长度为零,空格串长度为所包括的空格字符的个数。2、设s=‘I AM A STUDENT ’,t=‘GOOD’,q=‘WORKER’.求: 1)StrLength(s) 2)StrLength(t) 3)SubString(s,8,7) 4)SubSting(t,2,1) 5)Index(s,’A’) 6)index(s,t) 7)Replace(s,’STUDENT’,q) 8)Concat(SubString(s,6,2),Concat(t,SubString (s,7,8))) 答: 1)StrLength(s)=14 2)StrLength(t)=4 3)SubString(s,8,7) = ‘STUDENT’ 4)SubSting(t,2,1) = ‘O’ 5)Index(s,’A’)= 3

6)index(s,t) = 0 7)Replace(s,’STUDENT’,q) = ‘I AM A WORKER ’ 8)Concat(SubString(s,6,2),Concat(t,SubString(s, 7,8))) = ‘A GOOD STUDENT’ 3、若串S1=‘ABCDEFG’, S2=‘9898’ ,S3=‘###’,S4=‘012345’,执行 concat(replace(S1,substr(S1,length(S2),length(S3)),S3),subs tr(S4,index(S2,‘8’),length(S2)))其结果是多少? 答:ABC###G1234 4、下列算法实现求采用顺序结构存储的串s和串t的一个最长公共子串。请将空格处填上正确的语句。 void maxcomstr(orderstring *s,*t; int index, length) { int i,j,k,length1,con; index=0;length=0;i=1; while (i<=s.len) { j=1; while(j<=t.len) { if (s[i]= =t[j]) { k=1; length1=1; con=1; while(con) if (1) _ { length1=length1+1;k=k+1; } else (2) __; if (length1>length) { index=i; length=length1; } (3)____; } else (4) ___;

求回文子串 O(n) manacher算法

求回文子串O(n) manacher算法 回文串定义:“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。 回文子串,顾名思义,即字符串中满足回文性质的子串。 经常有一些题目围绕回文子串进行讨论,比如HDOJ_3068_最长回文,求最长回文子串的长度。朴素算法是依次以每一个字符为中心向两侧进行扩展,显然这个复杂度是O(N^2)的,关于字符串的题目常用的算法有KMP、后缀数组、AC自动机,这道题目利用扩展KMP 可以解答,其时间复杂度也很快O(N*logN)。但是,今天笔者介绍一个专门针对回文子串的算法,其时间复杂度为O(n),这就是manacher算法。 大家都知道,求回文串时需要判断其奇偶性,也就是求aba和abba的算法略有差距。然而,这个算法做了一个简单的处理,很巧妙地把奇数长度回文串与偶数长度回文串统一考虑,也就是在每个相邻的字符之间插入一个分隔符,串的首尾也要加,当然这个分隔符不能再原串中出现,一般可以用‘#’或者‘$’等字符。例如: 原串:abaab 新串:#a#b#a#a#b# 这样一来,原来的奇数长度回文串还是奇数长度,偶数长度的也变成以‘#’为中心的奇数回文串了。 接下来就是算法的中心思想,用一个辅助数组P记录以每个字符为中心的最长回文半径,也就是P[i]记录以Str[i]字符为中心的最长回文串半径。P[i]最小为1,此时回文串为Str[i]本身。 我们可以对上述例子写出其P数组,如下

新串:# a # b # a # a # b # P[] : 1 2 1 4 1 2 5 2 1 2 1 我们可以证明P[i]-1就是以Str[i]为中心的回文串在原串当中的长度。 证明: 1、显然L=2*P[i]-1即为新串中以Str[i]为中心最长回文串长度。 2、以Str[i]为中心的回文串一定是以#开头和结尾的,例如“#b#b#”或“#b#a#b#”所以L减去最前或者最后的‘#’字符就是原串中长度的二倍,即原串长度为(L-1)/2,化简的P[i]-1。得证。 依次从前往后求得P数组就可以了,这里用到了DP(动态规划)的思想,也就是求P[i]的时候,前面的P[]值已经得到了,我们利用回文串的特殊性质可以进行一个大大的优化。我先把核心代码贴上: for(i=1;ii) { p[i]=Min(p[2*id-i],MaxId-i); } else { p[i]=1; } while(a[i+p[i]]==a[i-p[i]]) { p[i]++; } if(p[i]+i>MaxId) { MaxId=p[i]+i; id=i; } }

修辞方法——回文

修辞方法——回文 修辞方法——回文泪鱼儿 修辞方法——回文 回文(回环):即利用相邻语句回环往复的巧妙配合,来表达两种事物相互制约、相互依存关系的一种修辞方法。大体可分几类。 1、回文句:即上下两句构成回环。又分两种情况。 (1)逐词(词组、句子)回环,如: 从我一生的经历,我悟出了一条千真万确的真理:只有社会主义才能解放科学,也只有在科学的基础上才能建设社会主义。科学需要社会主义,社会主义更需要科学。——郭沫若《科学的春天》(词的回环。论述了“社会主义”和“科学”互相依存、互相促进的关系)理性认识依赖于感性认识,感性认识有待于发展到理性认识,这就是辩证唯物论的认识论。——毛泽东《实践论》(短语的回环。阐明了“理性认识”和“感性认识”的辩证关系)群众的干劲越大,党越要关心群众生活,党越是关心群众生活,群众的干劲也是越大。(句子的回环。说明了“关心群众生活”与“群众的干劲”互相依存的辩证关系)诚则明矣,明则诚矣。——《礼记·中庸》(以单音词为单位回环,可以倒读) 健儿须快马,快马须健儿。——北朝乐府《折杨柳歌》(以复音词或词组为单位回环,不能倒读) 母别子,子别母。——白居易《母别子》(单音词回环) 霓裳弄,酒后黄鹤送。山翁醉我,我醉山翁。——贯云石《殿前欢》(复音词或词组回环) 泪双垂,垂双泪。三杯别酒,别酒三杯。鸾凤对拆开,拆开对鸾凤。岭外斜辉看看坠,看看坠岭外辉。天昏地暗,徘徊不舍,不舍徘徊。——《金瓶梅》九十三回《普天乐》真是越白越香,越香越白;令人越闻越爱,越爱越闻。——《镜花缘》三十三回 (2)其中某几个词最后换位。如: 学而不思则罔,思而不学则殆。——《论语·为政》 寒往则暑来,暑往则寒来。——《易经·系辞下》 原故财聚则民散,财散则民聚。——《礼记·大学》 古人不见今时月,今月却曾照古人。——李白《把酒问月》 意中有景,景中有意。——姜夔《白石诗话》 有士人入寺中,众僧皆起,一僧独坐。士人曰:“何以不起?”僧曰:“起是不起,不起是起。”士人以禅杖打其头,僧曰:“何必打我?”士人曰:“不打是打,打是不打。”——都散客《笑赞》 2、回文诗:即用每句都可倒读的句子组成的诗。大概起于晋。如: 静烟临碧树,残雪背晴楼。冷天侵极戍,寒月对行舟。——陆龟蒙《回文》 潮随暗浪雪山倾,远浦渔舟钓月明。桥对寺门松径小,槛当泉眼石波清。迢迢绿树江天晓,霭霭红霞晚日晴。遥望四边云接水,碧峰千点数鸥轻。——苏轼《题金山寺》花朵几枝柔傍砌,柳丝千缕细摇风。霞明半岭西斜日,月上孤村一树松。——《二刻拍案惊奇》卷十七 落雪飞芳树,幽红雨淡霞,薄日迷香雾,流风舞艳花。——清同治年间御窑制作的茶壶上所书,此据徐庭芹《修辞学发微》转录(此诗循环无端,可从任何一字读起,顺着从第一字、第二字……读起,得诗二十首,倒着从第二十字、第十九字……读起,又得诗二十首,共四十首) 3、回文词:把作回文诗的手段用到填词上,也就产生了回文词,如:

2016Nuist程序设计竞赛

1.莱布尼兹的最值 描述 莱布尼兹是德国哲学家、数学家,历史上少见的通才,被誉为十七世纪的亚里士多德。他和牛顿分别创立了微积分,而且在几何意义和符号记法上都要比牛顿高明。但是牛顿一直以皇家学会会长的身份打压势单力薄的莱布尼兹,欺骗世人。莱布尼兹含恨而死,但是历史最终还给了莱布尼兹一个清白,他说:“我穷尽我的一生的研究,包括我所创立的微积分都在研究一个问题,那就是最值。” 所以,莱布尼兹留下的是一个关于最值的问题. 输入 第一行一个整数n(n<=100),表示数据的个数。 接下来n行输入n个不同的正整数,莱布尼兹并不想为难大家所以数据都很小。 输出 输出一行:表示这n个数里面的最小值 样例输入 5 120 80 150 100 90 样例输出 80

2.欧几里得的公约数 描述 古希腊数学家欧几里得被称为“几何之父”,他最著名的著作《几何原本》是欧洲数学的基础,提出五大公式,欧几里得几何,被广泛的认为是历史上最成功的教科书。欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数,至今仍然被广泛运用。 欧几里得留下了n+1个数。 输入 第一个数为n,后面有n个数,请你计算出这n个数有多少与n互质(公约数只有1) 输出 整数n与其后的n个数互质的个数 样例输入 5 8 10 12 14 15 样例输出 3

3.图灵的密码 描述 图灵,英国数学家、逻辑学家,被称为计算机之父,人工智能之父。第二次世界大战其间,德国研制的密码机enigma让英国即使拦截到了消息也束手无策。1939年秋,图灵应召到英国外交部通信处从事军事工作,主要是破译enigma的工作。那时候破译都是用纸和笔计算但是德国人每天都会更换密钥,破译几乎不可能。就在人们一筹莫展的时候,图灵说:“只有机器才能战胜机器”,不顾世人的嘲讽开始制造大型机,最终破译成功帮助盟友取得了二战的胜利。 图灵留下的是加密算法,用0来对应一个“.”和四个“-”的组合,用1来对应两个“.”和三个“-”的组合......其余对照方式如下: 0 .---- 1 ..--- 2 ...-- 3 ....- 4 ..... 5 -.... 6 --... 7 ---.. 8 ----. 9 ----- 每行密码都以“-”开头和结束,每个电码间用一个“-”隔开 输入 输入一行数字明文,请你给出相应的密码。 输出 输出密码 样例输入 01 样例输出 -.-----..----

回文判断实验报告

回文判断实验报告 一.实验题目:回文判断 二.实验目的: 对于一个从键盘输入的字符串,判断其是否为回文。回文即正反序相同。如“abba”是回文,而“abab”不是回文。 三.实验需求: 1.数据从键盘读入; 2.输出要判断的字符串; 3.利用栈的基本操作对给定的字符串判断其是否是回文,若是则输出“Yes”否则输出“No” 四.主要实现函数 (1)建立顺序栈存储结构 typedef struct { } (2)初始化 int initstack(Sqstack &s,int maxsize) (3)入栈 int enstack(Sqstack &s, char e) (4)出栈 int popstack(Sqstack &s,char &e) (5)判断是否为回文 int main() { int r; //用于判断是否为回文 Sqstack L,Q; //定义两个栈

initstack(L,20); initstack(Q,20); int l; //用于记录输入字符的长度cout<<"请输入字符串长度"; cin>>l; if(l<=0)exit(1); cout<<"输入字符"<>p; enstack(L,p); //入栈 L } cout< using namespace std; typedef char SElemType; typedef struct { SElemType *base; SElemType *top; int stacksize;

栈和队列判断回文

(C语言版数据结构)利用栈和队列判断回文 (2010-11-03 11:51:45) 标签: it // File Name: palindrome.h // // Destination:利用栈和队列判断字符串是否是回文 // #ifndef PALINDROME #define PALINDROME #include // 链式队列结构的定义 typedef char ElemType; typedef struct Node { char data; // 元素数据 struct Node *next;// 链式队列中结点元素的指针 }QNode,*QueuePtr; typedef struct { QueuePtr front;// 队列头指针 QueuePtr rear;// 队列尾指针 }LinkQueue; // 栈结构的定义 typedef struct Stack { ElemType *base; ElemType *top; int stacksize; }SqStack;

// 链式队列的基本操作 bool InitQueue(LinkQueue *Q); bool EnQueue(LinkQueue *Q, ElemType e); bool DeQueue(LinkQueue *Q, ElemType *e); // 栈的基本操作 bool InitStack(SqStack *S); bool Push(SqStack *S, ElemType e); bool Pop(SqStack *S, ElemType *e); #endif // File Name: palindrome.cpp // // Destination:利用栈和队列判断字符串是否是回文 #include #include #include "palindrome.h" const int STACK_INIT_SIZE = 100; // 初始分配的长度 const int STACKINCREMENT = 10; // 分配内存的增量 //操作目的:初始化队列 //初始条件:无 //操作结果:构造一个空的队列 //函数参数: //LinkQueue *Q 待初始化的队列 //返回值: // bool 操作是否成功 ------------------------------------------------------------*/ bool InitQueue(LinkQueue *Q) { Q->front = Q->rear = (QueuePtr)malloc(sizeof (QNode)); if (!Q->front) { exit(0); } Q->front->next = NULL; return true; } //操作目的:在队列末尾插入元素e //初始条件:队列Q已存在 //操作结果:插入元素e作为队列新的尾结点 //函数参数:

算法设计与分析习题答案1-6章

习题1 1. 图论诞生于七桥问题。出生于瑞士的伟大数学家欧拉(Leonhard Euler ,1707—1783)提出并解决了该问题。七桥问题是这样描述的:一个人是否能在一次步行中穿越哥尼斯堡(现在 叫加里宁格勒,在波罗的海南岸)城中全部的七座桥后回到起点,且每座桥只经过一次,图是这条河以及河上的两个岛和七座桥的草图。请将该问题的数据模型抽象出来,并判断此问题是否有解。 七桥问题属于一笔画问题。 输入:一个起点 输出:相同的点 1, 一次步行 2, 经过七座桥,且每次只经历过一次 3, 回到起点 该问题无解:能一笔画的图形只有两类:一类是所有的点都是偶点。另一类是只有二个奇点的图形。 2.在欧几里德提出的欧几里德算法中(即最初的欧几里德算法)用的不是除法而是减法。请用伪代码描述这个版本的欧几里德算法 =m-n 2.循环直到r=0 m=n n=r r=m-n 图 七桥问题 南区

3 输出m 3.设计算法求数组中相差最小的两个元素(称为最接近数)的差。要求分别给出伪代码和C++描述。 编写程序,求n至少为多大时,n个“1”组成的整数能被2013整除。 #include using namespace std; int main() { double value=0; for(int n=1;n<=10000 ;++n) { value=value*10+1; if(value%2013==0) { cout<<"n至少为:"< using namespace std; int main () {

最长公共子序列

动态规划

一、问题描述 用动态规划法求两个字符串A=‘xzyzzyx’和B=‘zxyyzxz’的最长公共子序列 二、算法分析 (1)、若xm=yn,则zk=xm=yn,且Zk-1是Xm-1和Yn-1的最长公共自序列; (2)、若xm≠yn,且zk≠xm,则Zk是Xm-1和Yn的最长公共自序列; (3)、若xm≠yn,且zk≠yn,则Zk是Xm和Yn-1的最长公共自序列;设L(m,n)表示序列X={x1,x2,…,xm}和Y={y1,y2,…,yn}的最长公共子序列的长度 L表示已经决策的长度 S表示每个决策的状态 L(0,0)=L(0,j)=0 1≤i≤m, 1≤j≤n L(i-1,j-1)+1 xi=yi,i≥1,j≥1 L(i,j)= max{L(i,j-1),(L(i-1,j)} xi≠yi,i≥1,j≥1 1 xi=yi S(i,j)= 2 xi≠yi 且L(i,j-1)≥L(i-1,j) 3 xi≠yi 且L(i,j-1)< L(i-1,j)

长度矩阵L 三、源代码 #include #include using namespace std; int main() { string str1 = "xzyzzyx"; string str2 = "zxyyzxz"; int x_len = str1.length(); int y_len = str2.length();

int arr[50][50] ={{0,0}}; int i = 0; int j = 0; for(i = 1; i <= x_len; i++) { for(j = 1; j <= y_len; j++) { if(str1[i - 1] == str2[j - 1]) { arr[i][j] = arr[i - 1][j - 1] + 1; } else if(arr[i][j - 1] >= arr[i - 1][j]) arr[i][j] = arr[i][j - 1]; else arr[i][j] = arr[i -1][j]; } } for(i = 0 ; i <= x_len; i++) {

回文(数据结构)

//借助栈和链队列判断序列是否回文 #include #include #define ERROR 0 #define OK 1 #define STACK_INT_SIZE 10 /*存储空间初始分配量*/ #define STACKINCREMENT 5 /*存储空间分配增量*/ typedef char ElemType; /*定义元素的类型*/ typedef struct{ ElemType *base; ElemType *top; int stacksize; /*当前已分配的存储空间*/ }SqStack; typedef struct QNode{ ElemType data; struct QNode *next; }QNode,*Queue; typedef struct{ Queue front; Queue rear; }LinkQueue; int InitStack(SqStack *S){ S->base=(ElemType *)malloc(STACK_INT_SIZE *sizeof(ElemType)); if(!S->base) return ERROR; S->top=S->base; S->stacksize=STACK_INT_SIZE; return OK; }/*InitStack*/ int Push(SqStack *S,ElemType e){ if(S->top-S->base>=S->stacksize){ S->base=(ElemType*)realloc(S->base,(STACK_INT_SIZE+STACKINCREMENT)*sizeof(ElemType)); if(!S->base) return ERROR; S->top=S->base+S->stacksize;S->stacksize=S->stacksize+STACKINCREMENT; } *S->top++=e; return OK; }/*Push*/ int Pop(SqStack *S,ElemType &e){

数据结构--06字符串的基本操作

《数据结构》实验报告 院系光电与信息工程学院专业电子信息工程 姓名学号电话 2011级2班2013年4月22日 1.实验题目 实验6. 字符串的基本操作 2.需求分析 (1)字符串匹配。 采用顺序结构存储串,编写一个函数SubStr(str1,str2),用于判定str2是否是str1的子串。 (2)公共字符串。 问题描述编写一个函数,实现在两个已知字符串中找出所有非空最长公共子串的长度和最长公共子串的个数。 实现要求输出非空最长公共子串的长度和最长公共子串的个数。 字符串匹配: ①串长度Strlen(SString str) ②判断是否为子串SubStr(SString str1,SString str2) 公共字符串: ①串长度Strlen(SString str) ②最大公共串长度函数maxlen() ③求公共串个数函数SubStrnum() 输入形式:字符串。 3.概要设计 (1) ADT SString{ 数据对象:D={a i|a i∈IntegerSet,i=0,1,2,…,n,n≥0} 结构关系:R={|a i,a i+1 ∈D} 基本操作: Strlen(SString str) 操作前提:字符串str已存在 操作结果:求str的长度 SubStr(SString str1,SString str2) 操作前提:字符串str已存在 操作结果:判断str2是不是str1的子串 } ADT SString{ 数据对象:D={a i|a i∈IntegerSet,i=0,1,2,…,n,n≥0}

基本操作: Strlen(SString str) 操作前提:字符串str已存在 操作结果:求str的长度 maxlen(SString str1,SString str2,SString str) 操作前提:字符串str1,str2,str已存在 操作结果:求str1和str2的最大公共子串长度,并将该子串赋给str SubStrnum(SString str1,SString str2) 操作前提:字符串str1,str2已存在 操作结果:求在str1中str2子串的个数 } (2)字符串匹配: 本程序包含3个函数: ?主函数main() ?求串长函数Strlen(SString str) ?{字符串匹配函数SubStr(SString str1,SString str2) 各函数调用关系:主函数main调用其他两个函数 公共字符串: 本程序包含4个函数: ?主函数main() ?求串长函数Strlen(SString str) ?最大公共串长度函数maxlen() ?求公共串个数函数SubStrnum() 各函数调用关系:主函数main调用其他三个函数 (3)字符串匹配: 主函数的伪码 main() { 定义SString 变量str1,str2; 输入第一个字符串; 输入第二个字符串; 调用字符串匹配函数; 输出匹配结果; } 公共字符串: 主函数的伪码

最长公共子序列LCS 问题的matlab实现代码

(以下代码可直接带入matlab运行,首先以.m文件保存第一段代码,然后在command window输入第二段代码即可) function D=substringArray(A,B) na=length(A); nb=length(B); C=zeros(nb,na); for i=1:nb C(i,1)=0; end for j=1:na C(1,j)=0; end for i=2:nb for j=2:na if B(i-1)==A(j-1) C(i,j)=C(i-1,j-1)+1; else if C(i-1,j)>=C(i,j-1) C(i,j)=C(i-1,j); else C(i,j)=C(i,j-1); end end end end valmax=C(nb,na); i=nb; j=na; D=''; while i>1 & j>1 if C(i,j)==C(i-1,j-1)+1 & A(j-1)==B(i-1) D=strcat(B(i-1),D) ; i=i-1; j=j-1; else if C(i,j)==C(i,j-1) j=j-1; else i=i-1; end end end

%A='ACGTAACCT'; %B='GGACTTAGG'; %A='abcbs'; %B='bcabf'; A=getgenbank('NC_002017','SEQUENCEONLY',true); B=getgenbank('NC_002018','SEQUENCEONLY',true); substring=substringArray(A,B)

相关文档
最新文档