给定一个字符串,求这个字符串的最大回文数

给定一个字符串,求这个字符串的最大回文数
给定一个字符串,求这个字符串的最大回文数

题目:回文判断是一类典型的问题,尤其是与字符串结合后呈现出多姿多彩,在实际应用中比较广泛,下面介绍几个回文的问题。

首先我们要介绍一个什么叫回文数:回文,就是指一个字符串顺着读和反着读都是一样的字符串,例如madam,你我你,我爱我等等一些列的字符串

1、首先来判断一下一个字符串是否是回文字符串:

[java]view plaincopyprint?

1public int palindromeNumber(String s, int low, int high) {

2if (low == high)

3return1;

4else if (low < high) {

5if (s.charAt(low) == s.charAt(high) && (high - low) == 1) //防止出现abba等情况

6return1;

7if (s.charAt(low) == s.charAt(high) && (high - low) != 1) //这是类似aba的情况

8return palindromeNumber(s, low + 1, high - 1);

9else

10return0;

11 } else

12return0;

13 }

上面的这个方法,如果输入的字符串是回文字符串的话,则输出1,如果不是的话,输出0,2、已经明白了如何判断一个字符串是否是回文数,接下来我们就要求出一个给定字符串中最大的回文数是多少,就是把这个回文数的长度打出来

[java]view plaincopyprint?

14package programmer;

15

16import java.util.Scanner;

17

18/*

19 * 回文判断是一类典型的问题,尤其是与字符串结合后呈现出多姿多彩,在实际中使用也

20 * 比较广泛,而且也是面试题中的常客,所以本文就结合几个典型的例子来体味下回文之趣。

21 * 回文,英文palindrome,指一个顺着读和反过来读都一样的字符串,比如 madam、

22 * 我爱我,这样的短句在智力性、趣味性和艺术性上都颇有特色,中国历史上还有很多

23 * 有趣的回文诗呢

24 */

25public class PalindromeNumber {

26

27public int palindromeNumber(String s, int low, int high) {

28if (low == high)

29return1;

30else if (low < high) {

31if (s.charAt(low) == s.charAt(high) && (high - low) == 1)

32return1;

33if (s.charAt(low) == s.charAt(high) && (high - low) != 1)

34return palindromeNumber(s, low + 1, high - 1);

35else

36return0;

37 } else

38return0;

39 }

40

41/*

42 * 这里求一个字符串中的最长回文字符串的长度,我们使用了枚举的方法,但是这种方法的时间复杂度还是很大的,浪费了很多不必要的时间和判断,比如当判断

43 * 子串不是回文时,就不必要再判断包含本子串的父串了

44 */

45public int maxPalindrome1(String s) {

46int len = 0, max = 0;

47for (int i = 0; i < s.length(); i++) {

48for (int j = s.length() - 1; j >= i; j--) {

49if (palindromeNumber(s, i, j) == 1) {

50 len = j - i + 1;

51 }

52if (max < len)

53 max = len;

54 }

55 }

56return max;

57 }

58

59public static void main(String[] args) {

60 Scanner sc = new Scanner(System.in);

61 String s = sc.nextLine();

62 System.out.println(new PalindromeNumber().palindromeNumber(s, 0,

63 s.length() - 1));

64 System.out.println(new PalindromeNumber().maxPalindrome1(s));

65 }

66}

上面的思想也十分简单,就是逐个遍历,显然这是十分耗费时间的,时间复杂度为O(n*n*n),因为还要判断这个是否是回文数,所以比较浪费时间。接下来我们提供一种比较有建设性的方法。

3、我们知道回文数是正着读和反着读是一样的,就是说对于一个给定的字符串,如果我们将这个字符串逆置的话,我们就会发现两个字符串有一个最长的连续相同的子序列,则这个连续的最长的共同子序列就是我们要求的回文数,例如:abcabcba,反过来就是abcbacba,显然我们发现两个字符串连续的最长的共同子序列就是abcba,而abcba就是我们索要求的最长的回文数。下面是这个源代码:

[java]view plaincopyprint?

67package programmer;

68

69import java.util.Scanner;

70

71public class PalindromeNumber1 {

72 StringContain obj = new StringContain();

73

74public int Max(String s1, String s2) {

75int max = 0;

76for (int i = 0; i < s1.length(); i++) {

77for (int j = s2.length(); j > i; j--) {

78if (obj.stringContain(s1, s2.substring(i, j)) == 1) {

79if (max < j - i)

80 max = j - i;

81 }

82 }

83 }

84return max;

85 }

86

87public String reverseString(String s) {

88char[] c = new char[s.length()];

89 c = s.toCharArray();

90for (int i = 0, j = c.length - 1; i < j; i++, j--) {

91char ch = c[i];

92 c[i] = c[j];

93 c[j] = ch;

94 }

95return String.valueOf(c);

97

98public static void main(String[] args) {

99 Scanner sc = new Scanner(System.in);

100 String s1 = sc.nextLine();

101// System.out.println(s1.subSequence(0, s1.length() - 1));

102 String s2 = new PalindromeNumber1().reverseString(s1);

103 System.out.println(s2);

104 System.out.println(new PalindromeNumber1().Max(s1, s2));

105 }

106}

而其中我们用到了stringContain()方法,这是我写的判断一个字符串是否包含另外一个字符串的算法,代码如下:

[java]view plaincopyprint?

107package programmer;

108

109import java.util.Scanner;

110

111/*

112 * 这是判断字符串s1中是否包含字符串s2

113 */

114

115public class StringContain {

116public int stringContain(String s1, String s2) {

117int i, j;

118for (i = 0, j = 0; i < s1.length() && j < s2.length();) {

119if (s1.charAt(i) != s2.charAt(j)) {

120if (j != 0)

121 j = 0;

122else

123 i++;

124 } else {

125 i++;

126 j++;

127 }

128 }

129if (j == s2.length())

130return1;

131return0;

133

134public static void main(String[] args) {

135 Scanner sc = new Scanner(System.in);

136 String s1 = sc.nextLine();

137 String s2 = sc.nextLine();

138 System.out.println(new StringContain().stringContain(s1, s2));

139 }

140}

可能有些同学要说了,java里面直接就有contains方法,为什么要自己写了?我希望大家在学习算法的时间,最好不用或者少用java的特殊机制,你了解即可,因为算法是考察你的思维敏捷性的,语言的便利并不能给你带来太多思考上的便利。

4、难道大家不觉得上面求字符串最长回文数的方法不太好吗,一定有可以优化的地方,实际上也确实是这样的,上面求回文数的方法可以优化的地方在这儿,例如我们要求的字符串还是abcabcba,上面的几种求法差不多都是这样的思想:将此字符串的所有子字符串列出来,然后判断它们是不是回文数,其实我们不一定非要这样列出字符串,我们知道回文数是对称的,

则分为奇数个和偶数个来讨论,现在我们就假设是奇数个,则以中间的那个元素为中心,向两边扩展,再分别判断对称两边的字符是否相等,直到不等为止,然后求出最大的回文数的大小。

下面将步骤一一列出如下:以abcabcba为例,i代表中心字符所在的位置

(1)i=0,就是从字符a开始,a是起始字符,不好向左边扩展,则继续下去

(2)i=1,就是字符b,其左右字符分别为a c,但是a不等于c,则还要继续下去。。。。

下面贴出自己的源代码:

[java]view plaincopyprint?

141public int maxPalindrome2(String s) {

142int len = s.length();

143int max = 0;

144for (int i = 0; i < len; i++) {

145for (int j = 0; (i - j) >= 0 && (i + j) < len; j++) { //这是考虑中心元素是奇数个的情况,例如abcba

146if (s.charAt(i - j) != s.charAt(i + j))

147break;

148else

149 max = (max > (2 * j + 1) ? max : (2 * j + 1));

150 }

151for (int j = 0; (i - j) >= 0 && (i + j + 1) < len; j++) { //这是考虑中心元素个偶数个的情况,例如abccba

152if (s.charAt(i - j) != s.charAt(i + j + 1))

153break;

154else

155 max = (max > (2 * j + 2) ? max : (2 * j + 2));

156 }

157 }

158return max;

159 }

堆栈方式实现字符回文数判断(可运行)

设线性表A中有n个字符,试设计程序判断字符串是否中心对称,例如xyzyx和xyzzyx都是中心对称的字符串。 #include #include #include #include using namespace std; #define max 100 typedef char elemtype; typedef struct node { elemtype data; struct node *next; }listack; void initstack(listack *&s) { s=(listack*)malloc(sizeof(listack)); s->next=NULL; } int stacklength(listack *s) { int i=0; listack *p; p=s->next; while(p!=NULL) { i++; p=p->next; } return i; } void clearstack(listack *s) { listack *p=s->next; while(p!=NULL) { free(s); s=p; p=p->next; } } int stackempty(listack *s) { return(s->next==NULL);

void push(listack *& s,elemtype e) { listack *p; p=(listack*)malloc(sizeof(listack)); p->data=e; p->next=s->next; s->next=p; } int pop(listack *&s,elemtype &e) { listack *p; if(s->next==NULL) return 0; p=s->next; e=p->data; s->next=p->next; free(p); return 1; } int gettop(listack *s,elemtype &e) { if(s->next==NULL) return 0; e=s->next->data; return 1; } int judge(char *str) { listack *s;elemtype e; initstack(s); char *p=str; while(*p!='#') { push(s,*p); p++; } while(!stackempty(s)) { pop(s,e); if(e!=*str) return 0; str++; } return 1;

最长回文子串

[转]最长回文子串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数组满足这样一个性质呢? (下面的部分为图片形式)

回文判断教学总结

实验报告 系部计算机系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;

北邮通原硬件实验报告(DOC)

2013年通信原理硬件实验报告 学院:信息与通信工程学院 班级:2011211104 姓名: 学号: 班内序号: 组号: 同组人:

目录 实验一:双边带抑制载波调幅(DSB-SC AM) (3) 实验二:具有离散大载波的双边带调幅波(AM) (14) 实验三:调频(FM) (21) 实验六:眼图 (28) 实验七:采样,判决 (31) 实验八:二进制通断键控(OOK) (34) 实验十一:信号星座(选作) (41) 实验十二:低通信号的采样与重建 (45)

实验一双边带抑制载波调幅(DSB-SC AM) 一.实验目的 (1)了解DSB-SC AM信号的产生及相干解调的原理和实现方法。 (2)了解DSB-SC AM的信号波形及振幅频谱的特点,并掌握其测量方法。 (3)了解在发送DSB-SC AM信号加导频分量的条件下,收端用锁相环提取载波的原理及其实现方法。 (4)掌握锁相环的同步带和捕捉带的测量方法,掌握锁相环提取载波的测试方法。 二.实验器材 PC机一台、TIMS实验平台、示波器、导线等。 三.实验原理 1.双边带抑制载波调幅(DSB-SC AM)信号的产生和表达式 图1.1 2.双边带抑制载波调幅信号的解调 基本思路:利用恢复的载波与信号相乘,将频谱搬移到基带,还原出原基带信号。 图1.2 3.DSB-SC AM信号的产生及相干解调原理框图 ()()()()() cos c c c s t m t c t m t A t ω? ==+

图1.3 四.实验内容及结果 1.DSB-SC AM信号的产生 (1)实验步骤: 图1.4 1.按照上图,将音频振荡器输出的模拟音频信号及主振荡器输出的100KHz模

C语言回文数猜想

2.7.1.1 练习1 回文数的猜想 1输入一个数 2一个数,加上是这个数的倒序数,得出结果 3判断是否为回文数,是就退出,否则返回第2步骤 回文数:1336331、9559 典型:输入1735 1753+3571=5324 5324+4235=9559 9559就是一个回文数 程序解答过程: 1设计出各函数功能,便于调用 2编码,解答 各函数功能: 输入数据:int input(void) 对数据取逆序:int reverse(int data) 判断回文数:int ispalin(int data) 溢出判断:int isover(int data //palin.c #include int input(void) { int data=-1;//防止赋值失败? for(;;) { scanf("%d",&data); if(data>=10)//使得输入的数字不小于10 break; scanf("%*[^\n]");//取得除了换行\n之外的所有字符,抛掉 scanf("%*c");//抛掉换行\n } return data; }

int reverse(int data) { int res=0; for(;data>0;data=data/10)//取得data的的逆序 res=res*10+data%10;//data%10取得data最后一位数字 return res; } int ispalin(int data) { return data==reverse(data); } int isover(int data) { return data<=0||reverse(data)<=0;//当data大小越界,即超过2^31-1,变成负数 } int main() { int data=input(); int i; for(i=0;!isover(data);data+=reverse(data)) { if(!ispalin(data)) printf("[%d]:%d+%d=%d\n",++i,data,reverse(data),data+reverse(data)); else { printf("Palin:%d\n",data); return 0; } } printf("Can not find Palin!\n"); return 0; } 知识:unsigned int:2^32-1 int : 2^31-1 超过了最大值会越界,越界的数会变成负数

DSP硬件实验报告

北京邮电大学DSP硬件课程实验报告 姓名: 学号: 班级: 院系: 报告提交日期:

目录 一、实验环境——————————————————————3 二、实验一:常用指令实验 (1)简单指令程序运行实验———————————————3 (2)资料存储实验———————————————————5 (3)I/O实验—————————————————————7 (4)定时器实验————————————————————9 (5)I NT2中断实验——————————————————11 三、实验二:A/D采样实验———————————————13 四、实验三:D/A转换实验———————————————14 五、实验四:有限冲击响应滤波器(FIR)算法实验————15 六、实验总结—————————————————————17 七、参考文献—————————————————————17

一、实验环境 实验采用的是理工达盛开发的EL-DSP-II实验教学系统。在实验室电脑上首先进行DSP实验环境的设置。 环境设置的步骤: 1、在计算机BIOS中将驱动方式设为EPP模式; 2、安装开发器epp驱动; 3、安装CCS软件; 具体的环境设置步骤参照实验教材。 二、实验一:常用指令实验 (一)实验目的 1、熟悉DSP开发系统的连接; 2、了解DSP开发系统的组成和结构和应用系统构成; 3、熟悉常用C54X系列指令的用法(程序寻址,寄存器,I/O口,定时器,中断控制)。 (二)实验设备 计算机,CCS 2.0版软件,DSP仿真器,实验箱。 (三)实验操作方法 1、系统连接; 进行DSP实验之前,先必须连接好仿真器、实验箱及计算机,连接方法如下所示: 在硬件安装完成后,接通仿真器电源或启动计算机,此时,仿真盒上的“红色小灯”应点亮,否则DSP开发系统与计算机连接有问题。 2、运行CCS程序; 先实验箱上电,然后启动CCS,此时仿真器上的“绿色小灯”应点亮,并且CCS正常启动,表明系统连接正常;否则仿真器的连接、JTAG接口或CCS相关设置存在问题,掉电,检查仿真器的连接、JTAG接口连接,或检查CCS相关设置是否正确。成功运行程序后,首先应熟悉CCS的用户接口。学会CCS环境下程序编写、调试、编译、装载,学习如何使用观察窗口等。 3、修改样例程序,尝试DSP其他的指令; 4、填写实验报告; 5、样例程序实验操作说明。 (四)实验步骤与内容 1、简单指令程序运行实验 (1)实验使用资源 实验通过实验箱上的XF指示灯观察程序运行结果。 (2)实验过程

栈和队列判断回文

(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作为队列新的尾结点 //函数参数:

Java第一次作业-回文素数

《Java语言》课程作业 (第一次) 题目第8题 学院计算机学院专业 班别 学号 姓名陈聪 2015年4月22日

一、课程题目 8、题目:回文素数 回文素数是指一个数同时为素数和回文数。例如:131是一个素数,同时也是一个回文数。数字313和757也是如此。编写程序,显示前100个回文素数,每行显示10个数并且准确对齐,如下所示: 2 3 5 7 11 101 131 151 181 191 313 353 373 383 727 757 787 797 919 929 ……. …. …. ………………. [选题人数:3] 二、题目分析与设计 1、题目的需求:编写程序,显示前100个回文素数,每行显示10个数并且准确对齐。 2、制定对应程序的功能: (1)将2以后的素数挑选出来,直到显示完前100个回文素数:利用for循环。 (2)判断挑选出来的素数是否为回文数:通过将原素数倒置再与原素数比较来判断。 (3)输出回文素数,同时判断是否要换行,通过确定位数来使回文素数准确 对齐。 3、(1)程序功能层次图: (2)程序结构流程图:

4、所使用的开发环境:Eclipse (1)判断一个数是否为素数: i=2; while(i

while(s!=0) { b=b*10+s%10; s=s/10; } (3)判断素数是否为回文数并输出: if(a==b) { n++; if(n%10==0) System.out.printf("%8d\n",a); else System.out.printf("%8d",a); } 三、测试分析 1、题目的需求:编写程序,显示前100个回文素数,每行显示10个数并且准确对齐。因此本程序不需要构建测试数据。 2、运行程序的结果如下: 所得到的前一百个回文素数与预计结果一致,格式正确,每行显示10个数并且准确对齐。 附录:源代码 package hui; public class huiwen{ public static void main(String args[]){ int a,b,s;

回文(数据结构)

//借助栈和链队列判断序列是否回文 #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){

数据结构C语言版判断回文数试验报告

. 数据结构实验报告判断回文数 级班: 内序号班: 名生姓学: 教师导指: 时间: 201124月年10日

一、实验目的'. . 熟悉栈和队列的各项操作,区别栈和队列的操作原理。 二、实验内容 利用栈的操作完成读入的一个以*结尾的字符序列是否是回文序列的判断。 回文序列即正读与反读都一样的字符序列,例如:43211234*是回文序列,而789678*不是。三、数据结构及算法思想 算法思想:从键盘上读取一个字符,同时存储在顺序栈与链队列之中,直到字符序列的最后一个字符为*停止插入。在程序中设置了一个标志位flag,将输入的序列分别做入栈、出栈、入队、出队操作,若出栈与出队的数据完全一致,则将flag标志为1,否则为零。Flag为1,则表示该序列是回文序列,否则,为非回文序列。 四、模块划分 1.对各个模块进行功能的描述 (1)void InitStack(SeqStack *S):栈初始化模块,即初始化一个空栈,随后对该空栈进行数据的写入操作; (2)int Push(SeqStack *S,char x,int cnt):入栈操作,即给空栈中写入数据,数据长度有宏定义给出; (3)int Pop(SeqStack * S,char * x):出栈操作,即将栈中的数据输出,由于栈的操作是先进后出,因此,出栈的数据是原先输入数据的逆序; (4)void InitQuene(SeqQuene *Q):队列初始化,即初始化一个空队列,最后对该空队列进行数据的写入操作; (5)int EnterQuene(SeqQuene *Q,char x,int cnt):入队操作,即给空队列中写入数据,数据长度一样有宏定义给出; (6)int DeleteQuene(SeqQuene *Q,char *x,int cnt):出队操作,即将队列中的数据输出,由于队列的操作是先进先出,因此,出队的数据室原先输入数据的正序; (7)void main():主函数,用于调用前面的模块,进行出队数据与出栈数据的比较,判断输入的序列是否是回文序列。 2.模块之间关系及其相互调用的图示 '. .

回文判断实验二

回文判断实验二

洛阳理工学院实验报告 系别计算机系班级B13053 学号B13053235 姓名李登辉 2 课程名称数据结构实验日期2014.3.28 实验名称栈和队列的基本操作成绩 实验目的: 熟悉掌握栈和队列的特点,掌握与应用栈和队列的基本操作算法,训练和提高结构化程序设计能力及程序调试能力。 实验条件: 计算机一台,Visual C++6.0

实验内容: 1.问题描述 利用栈和队列判断字符串是否为回文。称正读与反读都相同的字符序列为“回文”序列。要求利用栈和队列的基本算法实现判断一个字符串是否为回文。栈和队列的存储结构不限。 2.数据结构类型定义 typedef struct { char elem[MAX]; int top; }SeqStack; 顺序栈 3.模块划分 void InitStack(SeqStack *S):栈初始化模块, int Push(SeqStack *S,char x,int cnt):入栈操作 int Pop(SeqStack * S,char * x):出栈操作 void InitQuene(SeqQuene *Q):队列初始化 int EnterQuene(SeqQuene *Q,char x,int cnt):入队操作 int DeleteQuene(SeqQuene *Q,char *x,int cnt):出队操作 void main():主函数 4.详细设计 #include #include #define MAX 50 #define FALSE 0 #define TURE 1//定义栈 typedef struct { char elem[MAX]; int top; }SeqStack; //定义循环队列 typedef struct { char element[MAX]; int front; int rear; }SeqQuene; //初始化栈

回文串实验报告

回文串实验报告 课程名称:数据结构 实验名称:单链表 学生姓名:杜克强 学生学号: 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)出队;

1004 绝对回文数

绝对回文数 Time Limit:10000MS Memory Limit:65536K Total Submit:30 Accepted:16 Description 绝对回文数,即其十,二进制均为回文,输入一个n值(<=100000),判断其是否为绝对回文数(二进制最前面的0不能算) ,若不是,输出”no”(不包括引号),若是,请按格式十进制值(二进制值),比如n=99时,其为绝对回文数,则输出99(1100011) 。 Input 一个n值。 Output 一行,按文中要求输出相应结果。 Sample Input 99 Sample Output 99(1100011) Source

?var ? i,j,n,l,l2:longint; ? a,b:array[1..100] of longint; ? bbt,flag:boolean; ?begin ? readln(n); ? l:=0; j:=n; ? while j<>0 do begin ? inc(l); ? a[l]:=j mod 10; j:=j div 10; ? end; ? l2:=0; j:=n; ? while j<>0 do begin ? inc(l2); ? b[l2]:=j mod 2; j:=j div 2; ? end; ? flag:=true; bbt:=true; ? for i:=1 to l div 2 do if a[i]<>a[l-i+1] then begin ? bbt:=false; break; ? end; ? if not bbt then flag:=false; ? bbt:=true; ? for i:=1 to l2 div 2 do if b[i]<>b[l2-i+1] then begin ? bbt:=false; break; ? end; ? if not bbt then flag:=false; ? if flag then begin ? for i:=1 to l do write(a[i]); write('('); ? for i:=1 to l2 do write(b[i]); ? writeln(')'); ? end ? else writeln('no'); ?end.

求回文子串 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; } }

回文判断

设计题目<二>: 3.4.4回文判断P59 1.设计要求 1.1问题描述 试写一个算法,判断依次读入的一个以@为结束符的字母序列,是否为形如“序列1&序列2”模式的字符序列。其中序列1和序列2中都不含字符“&”,且序列2是序列1的逆序列。例如:“a+b&b+a”是属该模式的字符序列,而“1+3&3-1”则不是。 1.2需求分析 这是一个利用栈结构完成的程序。为了实现算术优先算法,我们使用两个工作栈,一个称为操作符栈(OPTR),用以寄存运算符;一个称为操作数栈(OPND),用以寄存操作数或运算结果。算法的基本思想是: (1)输入测试数据组数,接着分组输入字符串,以@结尾。 (2)输入序列总长不超过(MAX_N = 10005)/2个。将序列1先入栈,接着处理序列2,同时出栈判断。 (3)将序列1全部入栈,接着输入序列2,同时出栈判断。 (4)如果序列满足题目要求,则输出“回文序列”;否则,输出“非回文序列”。 (5)测试数据: qwer&rewq@ qwerrewq@ qwer&rewq 12364&23131@ 2. 概要设计 2.1主界面设计 回文判断的程序界面设计并不复杂,有提示字符串输入及结束符号的信息即可。运行界面如下图所示:

图2.1 2.2数据结构 本系统采用顺序栈结构类型(stack)存储用户输入的字符串以便判断是否为回文。 typedef struct { char elem[Stack_Size]; //用来存放栈中元素的一维数组 int top; //用来存放栈顶元素的下标 }SeqStack; 使用结构体,内部定义数组模拟栈。top为栈顶指针,指向当前元素的下一个位置。 3 模块设计 3.1模块设计: 本程序包含3个模块:主程序模块,判断模块,和顺序栈操作模块,调用关系如下: 主程序回文判断模块顺序栈操作模块 图2.2 3.2 功能模块的调用关系图

回文问题

问题描述:编程序判断一个字符列是否是回文。回文是指一个字符序列以中间字符为基准两边字符完全相同。要求程序从键盘输入一个字符串,字符串长度小于等于80,用于判断回文的字符串中不包括字符串的结束标记符。 基本要求: (1)要求字符序列个数n可由用户随意确定,且有0top=0; } int StackNotEmpty(SeqStack S) //判断顺序堆栈S非空否,非空时返回1,否则返回0 { if(S.top<=0) return 0; else return 1; }

回文判断实验报告

回文判断实验报告 一.实验题目:回文判断 二.实验目的: 对于一个从键盘输入的字符串,判断其是否为回文。回文即正反序相同。如“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;

回文实验报告

实验题目 回文判断的算法 班级通信143 姓名刘峻霖学号2014101108 日期 2015年6月17日星期三

一、需求分析 1.程序的功能: 实现对字符序列是否是一个回文序列的判断 2.输入输出的要求: 从键盘读入一组字符序列,判断是否是回文,并将结果显示在屏幕上3.测试数据: 回文字符序列输入: 非回文字符序列输入: 二、概要设计 1.本程序所用的抽象数据类型的定义: typedef struct{ char item[STACKSIZE]; int top; }SqStack; typedef struct QNode{ char data; struct QNode *next; }LQNode, *PQNode; typedef struct{ PQNode front,rear;

} LinkQueue; 2.主程序的流程及各程序模块之间的层次关系。 (1)int InitStack(SqStack *S):栈初始化模块,即初始化一个空栈,随后对该空栈进行数据的写入操作; (2)int Push(SqStack *s, char data):入栈操作,即给空栈中写入数据,数据长度有宏定义给出; (3)int Pop(SqStack *s, char *data):出栈操作,即将栈中的数据输出,由于栈的操作是先进后出,因此,出栈的数据是原先输入数据的逆序; (4)int InitQueue(LinkQueue *q):队列初始化,即初始化一个空队列,最后对该空队列进行数据的写入操作; (5)int EnQueue(LinkQueue *q, char item):入队操作,即给空队列中写入数据,数据长度一样有宏定义给出; (6)int DeQueue(LinkQueue *q, char *item):出队操作,即将队列中的数据输出,由于队列的操作是先进先出,因此,出队的数据室原先输入数据的正序; (7)int main():主函数,用于调用前面的模块,进行出队数据与出栈数据的比较,判断输入的序列是否是回文序列。 模块之间关系及其相互调用的图示: 三、详细设计

数据结构课程设计回文数问题

湖南科技学院 课程设计报告 课程名称:数据结构课程设计 课程设计题目:02、回文问题 系: 专业: 年级、班: 姓名: 学号: 指导教师: 职称: 2011年12月

目录 1.问题描述 ----------------------------------------------------------------------3 2.具体要求 ----------------------------------------------------------------------3 3.测试数据 ----------------------------------------------------------------------3 4.算法思想 ----------------------------------------------------------------------3 5.模块划分 ----------------------------------------------------------------------4

6.数据结构 ----------------------------------------------------------------------4 7.源程序 ------------------------------------------------------------------------7 8.测试情况 --------------------------------------------------------------------14 9.设计总结 --------------------------------------------------------------------14 10.参考文献 --------------------------------------------------------------------15 一、问题描述

相关文档
最新文档