_中心对称字符串问题
CH4串专题知识讲座
j 1 2 345678
Pj a b a a b c a c next(j) 0 1 1 2 2 3 1 2
KMP算法(算法4.6)
int Index_KMP(SString S,SString T,int pos){ i=pos;j=1; while (i<=S[0]&&j<=T[0]) { if (j=0||S[i]==T[j]) {++i,;++j;} else j=next[ j ]; } if (j>T[0]) return i -T[0]; else return 0;
Concat(&T,S1,S2)旳算法示意图
0
maxstrlen 0
S1
S2
maxstrlen
T
S1[0]+S2[0] <= MAXSTRLEN 时
0
maxstrlen 0
maxstrlen
S1
S2
T
S1[0]+S2[0] > MAXSTRLEN 时
截断部分
0
maxstrlen
S1
S2
S1[0]== MAXSTRLEN 时
}
显然,该算法在最坏情况下旳时间复杂度为O((n-
m)*m)。
小结
BF(Brute-Force)算法旳特点:
简朴,易于了解,效率较高; 算法旳时间复杂度O((n-m)*m) 。(其中n,m分别为主串和
模式串旳长度)
实际运营中,时间近似于 O(n+m)。
注意:
当遇到一次si≠tj,主串要回退到i-j+2旳位置,而模式串要回 到第一种位置(即j=1旳位置);
中心对称知识点总结
中心对称知识点总结
嘿,朋友们!今天咱们来聊聊中心对称这个超有意思的知识点呀!
中心对称就像是一面神奇的镜子,能让图形变得对称又好看!比如说,一个圆形就是中心对称图形呀,它的圆心就是那个对称中心,不管从哪个角度看,都像是照镜子一样完美对称呢!
咱想想,如果一个图形绕着一个点旋转 180 度后,能和原来的图形完
全重合,哇塞,那这就是中心对称呀!就像我们照镜子,转个身后还是那个我们呀!举个例子呗,正方形也是中心对称图形呢,是不是很神奇?
中心对称在生活中也到处都是呀!你看那些美丽的建筑,很多不就是有着中心对称的美感吗?还有那些漂亮的图案设计,很多都利用了中心对称呢,这可不是随随便便就有的呀,这是设计师们的巧妙心思哟!
中心对称还有个重要的特点呢,就是对称点的连线都经过对称中心,而且被对称中心平分。
哎呀呀,这就好像是有根线把它们都串起来啦,有意思吧!比如说一个平行四边形,它的对角线就是这样的呀,这可不是瞎说说,这是确确实实存在的呀!
你们说,中心对称是不是特别奇妙?它就像一个隐藏在图形世界里的小精灵,等着我们去发现它的秘密呢!我觉得呀,中心对称真的是数学里超级有趣的一部分,它让我们看到了图形不一样的美,也让我们对数学更加着迷啦!
总之,中心对称就是这么棒,这么有趣!大家可得好好掌握它哦!。
《软件技术基础》实验指导
说明每个实验题目含有一个main函数和一些函数, 与实验题目相关的基本运算的函数定义和main函数定义的代码在附录以及对应的文件夹中给出, 供上机实验参考使用。
对于每个题目, 只需要根据题目要求设计算法, 补充函数定义, 然后对程序进行编译、调试。
实验一线性表一、实验目的1.熟悉线性表的顺序和链式存储结构2.掌握线性表的基本运算3.能够利用线性表的基本运算完成线性表应用的运算二、实验内容设有一个线性表E={e1, e2, …, en-1, en}, 设计一个算法, 将线性表逆置, 即使元素排列次序颠倒过来, 成为逆线性表E’={ en , en-1 , …, e2 , e1 }, 要求逆线性表占用原线性表空间, 并且用顺序表和单链表两种方法表示, 分别用两个程序来完成。
(文件夹: 顺序表逆置、单链表逆置)已知由不具有头结点的单链表表示的线性表中, 含有三类字符的数据元素(字母、数字和其他字符), 试编写算法构造三个以循环链表表示的线性表, 使每个表中只含有同一类的字符, 且利用原表中的结点空间, 头结点可另辟空间。
(文件夹: 分解单链表)实验二栈和队列一、实验目的1.熟悉栈和队列的顺序和链式存储结构2.掌握栈和队列的基本运算3.能够利用栈和队列的基本运算完成栈和队列应用的运算二、实验内容1.设单链表中存放有n个字符, 试编写算法, 判断该字符串是否有中心对称的关系, 例如xyzzyx是中心对称的字符串。
(提示: 将单链表中的一半字符先依次进栈, 然后依次出栈与单链表中的另一半字符进行比较。
)(文件夹: 判字符串中心对称)假设以数组sequ[m]存放循环队列的元素, 同时设变量rear和quelen 分别指示循环队列中队空的条件:sq->quelen==0;队满的条件:sq->quelen==m。
(文件夹:循环队列)实验三串一、实验目的1.熟悉串的顺序存储结构2.掌握串的基本运算及应用二、实验内容1. 串采用顺序存储结构, 编写朴素模式匹配算法, 查找在串中是否存在给定的子串。
中心对称符号
中心对称符号什么是中心对称符号?中心对称符号是指物体在某个点上具有对称性,即绕该点旋转180度后,物体仍然保持不变。
这个点被称为中心对称点,而物体在中心对称点处的旋转180度后的位置被称为对称位置。
中心对称符号在数学和几何学中被广泛应用,它具有重要的理论和实际意义。
在几何学中,中心对称符号是一种重要的对称性,可以帮助我们研究和描述物体的形状和结构。
中心对称符号的特点中心对称符号具有以下几个特点:1.对称轴:中心对称符号具有一个对称轴,该轴通过中心对称点并且与物体的其他部分垂直。
对称轴将物体分为两个对称的部分,这两个部分在旋转180度后重合。
2.对称性:中心对称符号具有对称性,即物体在对称轴两侧的部分是相互对称的。
这意味着物体的一部分可以通过旋转180度来重合另一部分。
3.不变性:中心对称符号在旋转180度后保持不变。
无论是物体的形状、结构还是其他属性,在旋转180度后都不会发生改变。
中心对称符号的应用中心对称符号在各个领域都有广泛的应用,以下是其中一些常见的应用示例:1. 几何学中心对称符号在几何学中被广泛应用,用于研究和描述物体的形状和结构。
通过分析物体的中心对称性,可以得到物体的对称轴、对称面等重要信息。
2. 化学中心对称符号在化学中也有重要的应用。
例如,有机化合物中的手性分子就具有中心对称性。
通过研究分子的中心对称性,可以了解分子的立体结构和性质,并为合成新的化合物提供指导。
3. 物理学在物理学中,中心对称符号常用于描述物体的对称性和守恒定律。
例如,在电磁学中,电荷守恒定律要求物体在中心对称变换下保持电荷守恒。
通过研究中心对称性,可以深入理解物体的物理性质。
4. 生物学中心对称符号在生物学中也有一定的应用。
例如,在动物的身体结构中,许多动物具有中心对称性。
通过研究动物的中心对称性,可以了解它们的生物学特征和进化历程。
5. 计算机图形学在计算机图形学中,中心对称符号可以用于生成对称的图像和模型。
《数据结构与算法》第四章-学习指导材料
《数据结构与算法》第四章串知识点及例题精选串(即字符串)是一种特殊的线性表,它的数据元素仅由一个字符组成。
4.1 串及其基本运算4.1.1 串的基本概念1.串的定义串是由零个或多个任意字符组成的字符序列。
一般记作:s="s1 s2 … s n""其中s 是串名;在本书中,用双引号作为串的定界符,引号引起来的字符序列为串值,引号本身不属于串的内容;a i(1<=i<=n)是一个任意字符,它称为串的元素,是构成串的基本单位,i是它在整个串中的序号; n为串的长度,表示串中所包含的字符个数,当n=0时,称为空串,通常记为Ф。
2.几个术语子串与主串:串中任意连续的字符组成的子序列称为该串的子串。
包含子串的串相应地称为主串。
子串的位置:子串的第一个字符在主串中的序号称为子串的位置。
串相等:称两个串是相等的,是指两个串的长度相等且对应字符都相等。
4.2 串的定长顺序存储及基本运算因为串是数据元素类型为字符型的线性表,所以线性表的存储方式仍适用于串,也因为字符的特殊性和字符串经常作为一个整体来处理的特点,串在存储时还有一些与一般线性表不同之处。
4.2.1 串的定长顺序存储类似于顺序表,用一组地址连续的存储单元存储串值中的字符序列,所谓定长是指按预定义的大小,为每一个串变量分配一个固定长度的存储区,如:#define MAXSIZE 256char s[MAXSIZE];则串的最大长度不能超过256。
如何标识实际长度?1. 类似顺序表,用一个指针来指向最后一个字符,这样表示的串描述如下:typedef struct{ char data[MAXSIZE];int curlen;} SeqString;定义一个串变量:SeqString s;这种存储方式可以直接得到串的长度:s.curlen+1。
如图4.1所示。
s.dataMAXSIZE-1图4.1 串的顺序存储方式12. 在串尾存储一个不会在串中出现的特殊字符作为串的终结符,以此表示串的结尾。
猿人学第9题 解题思路
猿人学第9题解题思路
猿人学第9题要求解决的问题是找到一个字符串中最长的回文子串。
解题思路如下:
1. 定义两个变量,start和end,分别用于记录最长回文子串的起始和终止位置。
2. 遍历字符串的每个字符,以每个字符为中心向两边扩展,查找回文子串。
对于每个字符,都有两种情况需要考虑:奇数长度的回文子串和偶数长度的回文子串。
3. 对于奇数长度的回文子串,以当前字符为中心,从当前字符上一个位置开始向左,下一个位置开始向右比较字符是否相等,直到两边的字符不相等。
记录能够扩展的最大距离,以及当前回文子串的起始和终止位置。
4. 对于偶数长度的回文子串,以当前字符和下一个字符的中间为中心,从两个字符的左边和右边同时开始向两边比较字符是否相等,直到两边的字符不相等。
记录能够扩展的最大距离,以及当前回文子串的起始和终止位置。
5. 每次扩展完成后,比较当前回文子串的长度是否大于之前记录的最长回文子串的长度。
如果是,则更新最长回文子串的起始和终止位置。
6. 最后,通过起始和终止位置获取最长回文子串,并将其返回。
通过以上思路,可以实现一个时间复杂度为O(n^2)的算法来找到字符串中最长的回文子串。
1_金策_字符串算法选讲
. .
字符串算法选讲
金策
清华大学交叉信息研究院
February 3, 2017
字符串算法选讲 Periods and borders Basics
字符串: s[1..n], |s| = n。 字符集: s[i] ∈ Σ。算法竞赛中常见的 Σ 是 26 个小写英文字 母。 子串 s[i..j ] = s[i]s[i + 1] · · · s[j ]。 前缀 pre(s, x) = s[1..x], 后缀 suf(s, x) = s[n − x + 1..n]。
求出 pre(t, 2i−1 ) 在 suf(t, 2i ) 中匹配的所有位置, 以及 suf(t, 2i−1 ) 在 pre(t, 2i ) 中匹配的所有位置。移位后取交集即可。
字符串算法选讲 Periods and borders Factor periodicity problem
Internal Pattern Matching (IPM) Queries (Easy)
字符串算法选讲 Periods and bop ≤ |s|, s[i] = s[i + p], ∀i ∈ {1, · · · , |s| − p}, 就称 p 是 s 的周期 (period)。 若 0 ≤ r < |s|, pre(s, r) = suf(s, r), 就称 pre(s, r) 是 s 的 border。 pre(s, r) 是 s 的 border ⇔ |s| − r 是 s 的周期。 u . border 比如 abaaaba 就有周期 4, 6, 7, 对应的 border 是 aba,a, 和 ϵ。 period
字符串算法选讲 Periods and borders Factor periodicity problem
字符串hash以及7大问题(1)
15
p和mod的取法
• 我们一般认为p和mod一般取素数,p取一个 较大的素数即可(6位到8位),mod取一个 大素数,比如1e9+7,或者1e9+9。 • 具体为什么这样做就能够大概率地避免冲突 ,或者它具体的概率是多少,若想钻研,请 google • 但,可以肯定的是,这样子的取法,冲突的 概率非常低!低到我们可以基本放心地去用 这个函数解决一般的hash问题。
8
关于hash的简单问题
• 问题: • 给N个字符串,每个字符串长度不超过100, 问这些字符串里有多少个不同的字符串? • 即相同字符串只取一个,最后剩下多少字符 串? • 数据范围:1=<N<=100000 • 字符集:小写英文字母(ut • 第一行输入一个整数N • 接下来N行输入N个字符串,每个字符串长 度不超过100 • Output • 输出一个整数,表示有多少个不同的串。
7
hash
• 我们要判断两个字符串是否一致,没有那么 麻烦,直接先判断长度是否一致,然后再判 断每个对应的字符是否一致即可。 • 但,如果要判断多个字符串里有多少个不同 的字符串,怎么办呢? • 两两字符串都进行比较?时间复杂度太高 • 把每个字符串hash成一个整数,然后把所有 整数进行一个去重操作,即可知道答案了。 • 我们来具体看下这个问题。
13
字符串hash
• 解决的方法非常简单,想办法调整p和mod, 使得冲突概率减小之又小。 • 那么怎么调整才能使冲突概率小之又小呢? • 一句话告诉你,p取一个较大素数,mod取一 个大素数。 • 习惯上,p取一个6到8位的素数即可,mod一 般取大素数 1e9+7(1000000007)或 1e9+9(1000000009) 可是,为什么这样做就会冲突概率小之又小?
根据点的对称求字母洋葱数学
根据点的对称求字母洋葱数学【实用版】目录1.对称的概念2.点的对称3.字母洋葱数学的含义4.利用点的对称求字母洋葱数学的方法5.实际应用案例正文对称是一种广泛存在于自然界和人类社会中的现象,它指的是某一物体或结构在特定条件下可以围绕某一中心轴旋转一定角度后与原状完全重合。
在数学领域,对称主要研究点、线、面的对称性。
本文将从点的对称出发,介绍如何运用点的对称求字母洋葱数学。
点对称是指在平面上,以某一点为中心,将另一点关于这个中心点作对称变换。
在字母洋葱数学中,我们需要研究的是字母的点对称。
具体来说,就是将一个字母围绕它的中心点进行对称变换,得到一个新的字母。
那么,如何利用点的对称求字母洋葱数学呢?我们可以通过以下步骤进行操作:1.首先,确定字母的中心点。
对于大多数字母来说,中心点通常位于字母的几何中心,如“A”的中心点在字母的顶部,“B”的中心点在字母的中部。
2.然后,确定需要进行对称变换的点。
这个点可以是字母的任意一部分,如“A”的左下角、“B”的右上角等。
3.接下来,以中心点为基准,将需要进行对称变换的点关于中心点作对称变换。
对于二维平面上的点 (x, y),其关于原点的对称点为 (-x, -y)。
4.最后,根据对称后的点,写出对应的字母。
举个例子,假设我们要求字母“A”关于中心点进行对称变换,那么首先找到中心点,然后找到左下角的点,如 (-1, -1)。
将这个点关于中心点作对称变换,得到新的点为 (1, 1)。
根据这个点,我们可以写出对称后的字母为“涙”。
总之,利用点的对称求字母洋葱数学是一种有趣的数学方法,它有助于我们更好地理解字母的结构和对称性。
公务员计算机专业真题+答案安徽省考 安徽省公务员考试
2009年安徽公务员考试计算机专业课大纲(预测)一、考试说明1. 考试设置计算机专业课试卷分为客观题和主观题两部分,总分100分,考试时间为120分钟2. 考试要求通过本考试的合格人员应能符合安徽省公务员计算机岗位的要求,掌握计算机的基础知识,熟练使用Windows操作系统和常用办公软件,具备一定的算法程序设计能力,熟悉计算机网络技术及其简单应用,熟练掌握数据库的基本原理和日常应用,具备一定的软件工程知识。
二、考试题型主要有:单项选择题、多项选择题、填空题、判断题、简答题、程序算法设计题。
三、考试范围1. 知识架构第一部分计算机科学技术基础计算机基础知识、多媒体技术、计算机信息安全技术、Internet 知识。
第二部分计算机软件及应用Windows 2000/xp操作系统、Word 2003、Excel 2003、C语言程序设计。
第三部分计算机理论关系数据库理论、网络技术基础、数据结构、软件工程基础2. 分值分布计算机基础25分左右计算机软件15分左右计算机网络20分左右C语言及算法数据结构 20分左右数据库理论15分左右软件工程5分左右第一部分计算机科学技术基础(识记)知识纲要:计算机基础知识、多媒体技术、计算机信息安全技术、Internet知识。
第一章计算机基础知识一、计算机的特点、分类及其应用二、信息编码与数据表示,数制及其转换三、计算机硬件系统的组成及其基本工作原理四、计算机软件系统的组成,系统软件和应用软件的基本概念、功能和分类五、软件基础知识,计算机程度设计语言的基本概念第二章多媒体技术一、多媒体的基本概念及关键技术二、多媒体计算机及设备三、多媒体技术及其应用第三章计算机信息安全技术一、信息安全的相关概念与技术二、计算机病毒的定义、特性、结构及分类三、计算机病毒的检测与防治四、计算机木马的特征及其与病毒的区别第四章 Internet知识一、计算机网络的功能、结构、分类和使用方式二、Internet的基础知识、网址与域名系统、TCP/IP协议三、Internet的连接与服务功能四、WWW与浏览器的应用五、Internet和Extranet六、流行的Internet应用例如:BT下载(是一个最新概念 Peer to Peer,P2P 的下载工具、它采用了多点对多点的原理,人人电脑都是服务器的思想,下载的人越多,共享的人越多,下载的速度也越快。
算法与数据结构考研试题精析(第二版)第4章串答案概要
第四章串一、选择题1.B 2.E 3.C 4.A5.C6.A7.1D 7.2F 8.B注9.D 10.B注:子串的定义是:串中随意个连续的字符构成的子序列,并规定空串是随意串的子串,随意串是其自己的子串。
若字符串长度为n(n>0),长为n的子串有1个,长为n-1的子串有2个,长为n-2的子串有3个,,,,长为1的子串有n个。
因为空串是任何串的子串,所以此题的答案为:8*(8+1)/2+1=37。
应选B。
但某些教科书上以为“空串是随意串的子串”无心义,所以以为选C。
为防止考试中的二意性,编者以为第9题出得好。
二、判断题1.√2.√3.√三.填空题1.(1)由空格字符(ASCII值32)所构成的字符串(2)空格个数23.随意个连续的字符构成的子序列4.5 5.O(m+n) 6.011223127.010104218.(1)模式般配(2)模式串.字符9.(1)其数据元素都是字符(2)次序储存(3)和链式储存(4)串的长度相等且两串中对应地点的字符也相等10.两串的长度相等且两串中对应地点的字符也相等。
11.’xyxyxywwy’12.*s++=*t++或(*s++=*t++)!=‘\0’13.(1)chars[] (2)j++ (3)i>=j14.[题目剖析]此题算法采纳次序储存构造求串s和串t的最大公共子串。
串s 用i指针(1<=i<=s.len)。
t串用j指针(1<=j<=t.len)。
算法思想是对每个i(1<=i<=s.len,即程序中第一个WHILE循环),来求从i开始的连续字符串与从j(1<=j<=t.len,即程序中第二个WHILE循环)开始的连续字符串的最大般配。
程序中第三个(即最内层)的WHILE循环,是当s中某字符(s[i])与t中某字符(t[j])相等时,求出局部公共子串。
若该子串长度大于已求出的最长公共子串(初始为0),则最长公共子串的长度要改正。
中心对称公式
中心对称公式中心对称这个概念在数学中可有意思啦!咱先来说说啥是中心对称。
简单来讲,就是如果一个图形绕着某个点旋转 180 度后能和原来的图形重合,那这个图形就具有中心对称的性质。
比如说,平行四边形就是一个典型的中心对称图形。
想象一下,你拿着一个平行四边形的模型,找到它的对称中心,然后把它转个 180 度,嘿,它和原来的样子一模一样!那中心对称有没有公式呢?其实啊,中心对称更多的是一种几何上的性质,没有像代数公式那样特别明确的表达式。
但是在解决相关问题的时候,我们可以通过一些方法来找到对称中心。
假如有两个点 A(x1, y1) 和 B(x2, y2) ,它们关于某个点 O 中心对称,那么这个对称中心 O 的坐标就可以通过公式算出来。
对称中心 O 的横坐标是 (x1 + x2) / 2 ,纵坐标是 (y1 + y2) / 2 。
我记得有一次给学生们讲这个知识点的时候,有个小家伙怎么都转不过弯来。
我就拿出一张纸,画了两个点,然后一点点给他演示,就像变魔术一样。
我告诉他:“你看,这两个点就像两个调皮的小精灵,它们要找到那个能让它们转个身就回到原位的中心点,咱们就一起来找找。
” 小家伙眼睛瞪得大大的,看得特别认真。
最后,当他终于搞明白的时候,那兴奋的表情,就好像发现了新大陆一样。
在实际应用中,中心对称的知识用处可大了。
比如在设计图案的时候,利用中心对称可以创造出很多美丽又对称的作品。
再比如在解决一些几何证明题时,通过判断图形是否中心对称,能找到解题的关键线索。
总之,中心对称虽然没有那种让人一看就觉得很复杂的公式,但通过理解和运用相关的方法,咱们就能轻松搞定很多和它有关的问题。
所以呀,同学们在学习中心对称的时候,别被它吓到,多动手画画,多想想,其实它就像我们身边的好朋友,很亲切很好懂的!。
第4章 字符串 习题参考答案
第4章串习题参考答案一、基础知识题4.1 简述下列每对术语的区别:空串和空格串;串常量与串变量;主串和子串;串变量的名字和串变量的值;静态分配的顺序串与动态分配的顺序串。
【解答】不含任何字符的串称为空串,其长度为0。
仅含有空格字符的串称为空格串,其长度为串中空格字符的个数。
空格符可用来分割一般的字符,便于人们识别和阅读,但计算串长时应包括这些空格符。
空串在串处理中可作为任意串的子串。
用引号(数据结构教学中通常用单引号,而C语言中用双引号)括起来的字符序列称为串常量,串值可以变化的量称为串变量。
串中任意个连续的字符组成的子序列被称为该串的子串。
包含子串的串又被称为该子串的主串。
子串在主串中第一次出现的第一个字符的位置称子串在主串中的位置。
串变量的与其它变量一样,要用名字引用其值,串变量的名字也是标识符,串变量的值可以修改。
串的存储也有静态存储和动态存储两种。
静态存储指用一维数组,通常一个字符占用一个字节,需要静态定义串的长度,具有顺序存储结构的优缺点。
若需要在程序执行过程中,动态地改变串的长度,则可以利用标准函数malloc()和free()动态地分配或释放存储单元,提高存储资源的利用率。
在C语言中,动态分配和回收的存储单元都来自于一个被称之为“堆”的自由存储区,故该方法可称为堆分配存储。
类型定义如下所示:typedef struct{ char *str;int length;}HString;4.2设有串S=’good’,T=’I︼am︼a︼student’,R=’!’,求:(1)StringConcat(T,R) (2)SubString(T,8,7)(3)StringLength(T) (4)Index(T,’a’)(5)StringInsert(T,8,S)(6)Replace(T,SubString(T,8,7),’teacher’)【解答】(1) StringConcat(T,R)=’I︼am︼a︼student!’(2) SubString(T,8,7)=’student’(3) StringLength(T)=14(4) Index(T,’a’)=3(5) StringInsert(T,8,S)=’I︼am︼a︼goodstudent’(6) Replace(T,SubString(T,8,7),’teacher’)= ’I︼am︼a︼teacher’4.3若串S1=‘ABCDEFG’,S2=‘9898’,S3=‘###’,S4=‘012345’,执行concat(replace(S1,substr(S1,length(S2),length(S3)),S3),substr(S4,index(S2,‘8’),length(S2))) 操作的结果是什么?【解答】concat(replace(S1,substr(S1,length(S2),length(S3)),S3),substr(S4,index(S2,‘8’),length(S2))) = concat(replace(S1,substr(S1,4,3),S3),substr(S4,2,4))= concat(replace(S1,’DEF’,S3),’1234’)= concat(‘ABC###G ’,’1234’)= ‘ABC###G1234’4.4 设S 为一个长度为n 的字符串,其中的字符各不相同,则S 中的互异的非平凡子串(非空且不同于S 本身)的个数是多少?【解答】长度为n 的字符串中互异的非平凡子串(非空且不同于S 本身)的个数计算如下: 长度为1的子串有n 个,长度为2的子串有n-1个,长度为3的子串有n-2个,……,长度为n-1的子串有2个,长度为n 的子串有1个(按题意要求这个子串就是S 本身,不能计算在总数内)。
C语言程序设计下mooc答案
—06.30北京理工大学M O O C C语言程序设计(下)网上作业答案第一周编程作业1、求最大公约数和最小公倍数(15分)题目内容:编写程序,在主函数中输入两个正整数 a,b,调用两个函数 fun1() 和 fun2(),分别求 a 和 b 的最大公约数和最小公倍数,在主函数中输出结果。
输入格式:两个正整数输出格式:最大公约数和最小公倍数输入样例:12,40[回车]输出样例:最大公约数:4[回车]最小公倍数:120[回车]时间限制:500ms内存限制:32000kbCode:#include <stdio.h>int fun1(int m,int n){int r;r=m%n;return r==0?n:fun1(n,r);}int fun2(int m,int n){int t;t=m*n/fun1(m,n);return t;}int main(){ int t,m,n;scanf("%d,%d",&m,&n);if(m<n){t=m;m=n;n=t;}printf("最大公约数:%d\n",fun1(m,n));printf("最小公倍数:%d\n",fun2(m,n));return 0;}2、排序并插入(15分)题目内容:编写程序,在主函数中定义一个有10个元素的整型一维数组,用户输入9个数据,调用函数,对数组元素进行从小到大排序后,在函数中输入一个数,插入到数组中正确的位置,并输出。
输入格式:9个整数和1个整数输出格式:10个整数输入样例:2,3,1,5,6,76,89,31,90[回车]7[回车]输出样例:1,2,3,5,6,7,31,76,89,90[回车]时间限制:500ms内存限制:32000kb Code:#include <stdio.h>int main(){int t,j,i,n[10];for(i=0; i<9; i++){scanf("%d", &n[i]);if(i<8) scanf(",");}scanf("%d",&n[9]) ;for(i=0;i<9;i++){for(j=0;j<= 8-i;j++){if(n[j] > n[j+1]){t = n[j];n[j] = n[j+1];n[j+1] = t;}}}for(i=0;i<10;i++){printf("%d",n[i]);if(i<9) printf(",");}return 0;}第二周编程作业1、最大公约数(15分)题目内容:输入两个整数m,n,用递归算法实现计算两个数的最大公约数。
回文子串数目
回文子串数目回文子串指的是正读和反读都是相同的字符串。
求一个字符串中回文子串的数量是一个经典的问题,在这篇文章中,我们将详细讨论这个问题,并介绍几种解决方法。
首先,我们来看一些示例。
对于字符串"abcba",它的回文子串有"a"、"b"、"c"、"b"、"a"、"abcba",一共有6个。
对于字符串"aaa",它的回文子串有"a"、"a"、"a"、"aa"、"aa"、"aaa",一共有6个。
解决这个问题的一种简单方法是枚举所有可能的子串,然后判断是否是回文。
这种方法的时间复杂度是O(n^3),其中n是字符串的长度。
具体的实现如下所示:```pythondef countPalindromeSubstrings(s: str) -> int:count = 0n = len(s)for i in range(n):for j in range(i, n):if isPalindrome(s[i:j+1]):count += 1return countdef isPalindrome(s: str) -> bool:return s == s[::-1]```上述代码中的函数`countPalindromeSubstrings`用于计算字符串中的回文子串数量,而函数`isPalindrome`用于判断一个字符串是否是回文。
这种方法虽然简单,但是时间复杂度较高,当字符串长度很大时,计算量将会非常大。
因此,我们需要寻找更加高效的解决方法。
动态规划是解决这个问题的一种常见方法。
利用动态规划,我们可以通过已知的信息来计算未知的信息。
Manacher算法(马拉车)
Manacher算法(马拉车)马拉车的解决的问题:给定字符串S,求S中的?解释:回⽂串就是正读反读都⼀样的字符串,⽐如奇回⽂串(bab)、偶回⽂串(noon)。
马拉车算法步骤:1)由于回⽂串存在奇回⽂串和偶回⽂串,马拉车算法第⼀步就是:预处理字符串,做法是在每⼀个字符的左右都加上⼀个特殊字符(前提是这个字符在字符串没有出现过),使这两种回⽂串都变成偶回⽂串。
⽐如加上’#’,这样奇回⽂串(bab)还是会变成奇回⽂串(#b#a#b#),偶回⽂串(noon)会变成奇回⽂串(#n#o#o#n#)。
2)然后我们定义⼀个辅助数组p⽤来表⽰经过与处理过的新字符串t,其中p[i]表⽰以字符t[i]为半径的回⽂⼦串长度,例如:index012345678910111213char$#1#2#2#1#2#2#R12125216123213)找规律规律①:最⼤半径减1等于最长回⽂串的长度看上⾯那个例⼦,以中间的 ‘1’ 为中⼼的回⽂⼦串 “#2#2#1#2#2#” 的半径是6,⽽未添加#号的回⽂⼦串为 “22122”,长度是5,为半径减1。
这是个普遍的规律么?我们再看看之前的那个 “#b#o#b#”,我们很容易看出来以中间的 ‘o’ 为中⼼的回⽂串的半径是4,⽽ "bob"的长度是3,符合规律。
再来看偶数个的情况 “noon”,添加#号后的回⽂串为 “#n#o#o#n#”,以最中间的 ‘#’ 为中⼼的回⽂串的半径是5,⽽ “noon” 的长度是4,完美符合规律。
所以我们只要找到了最⼤的半径,就知道最长的回⽂⼦串的字符个数了。
只知道长度⽆法定位⼦串,我们还需要知道⼦串的起始位置。
规律②:最长回⽂字符的起始位置是中间位置减去半径在除以2我们还是先来看中间的 ‘1’ 在字符串 “#1#2#2#1#2#2#” 中的位置是7,⽽半径是6,貌似 7-6=1,刚好就是回⽂⼦串 “22122” 在原串 “122122” 中的起始位置1。
字符串类问题分析
字符串类问题汇总说明:有部分题目会在题目要求中明确提出不允许使用字符串库函数,请注意!1、转换问题(1)大小写字母之间的转换例:8-2下列给定程序中函数fun的功能是:将tt所指字符串中的小写字母全部改为对应的大写字母,其它字符不变。
例如,若输入"Ab,cD",则输出"AB,CD"。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!试题程序:#include<stdio.h>#include<string.h>char* fun( char tt[] ){int i;for( i = 0; tt[i]; i++ )/**********found***********/if(( 'a' <= tt[i] )||( tt[i] <= 'z' ) ) /* 改:if(( tt[i]>='a')&&( tt[i] <= 'z')) *//**********found***********/tt[i] += 32; /* 改:tt[i]-=32; */return( tt );}main( ){char tt[81];printf( "\nPlease enter a string: " );gets( tt );printf( "\nThe result string is:\n%s", fun( tt ) );}(2)字符与数字间的转换例:7-1下列给定程序中,函数fun的功能是进行数字字符转换。
若形参ch中是数字字符'0'~'9',则将'0'转换成'9','1'转换成'8','2'转换成'7',……,'9'转换成'0';若是其它字符则保持不变;并将转换后的结果作为函数值返回。
1.7编程基础之字符串(30题)
01:统计数字字符个数∙∙提交∙统计∙提问总时间限制:1000ms内存限制:65536kB描述输入一行字符,统计出其中数字字符的个数。
输入一行字符串,总长度不超过255。
输出输出为1行,输出字符串里面数字字符的个数。
来源习题(7-1) 医学部2010 期末试题樊波02:找第一个只出现一次的字符∙∙提交∙统计∙提问总时间限制:1000ms内存限制:65536kB描述给定一个只包含小写字母的字符串,请你找到第一个仅出现一次的字符。
如果没有,输出no。
输入一个字符串,长度小于100000。
输出输出第一个仅出现一次的字符,若没有则输出no。
03:基因相关性∙∙提交∙统计∙提问总时间限制:1000ms内存限制:65536kB描述为了获知基因序列在功能和结构上的相似性,经常需要将几条不同序列的DNA进行比对,以判断该比对的DNA是否具有相关性。
现比对两条长度相同的DNA序列。
首先定义两条DNA序列相同位置的碱基为一个碱基对,如果一个碱基对中的两个碱基相同的话,则称为相同碱基对。
接着计算相同碱基对占总碱基对数量的比例,如果该比例大于等于给定阈值时则判定该两条DNA序列是相关的,否则不相关。
输入有三行,第一行是用来判定出两条DNA序列是否相关的阈值,随后2行是两条DNA序列(长度不大于500)。
输出若两条DNA序列相关,则输出“yes”,否则输出“no”。
04:石头剪子布描述石头剪子布,是一种猜拳游戏。
起源于中国,然后传到日本、朝鲜等地,随着亚欧贸易的不断发展它传到了欧洲,到了近现代逐渐风靡世界。
简单明了的规则,使得石头剪子布没有任何规则漏洞可钻,单次玩法比拼运气,多回合玩法比拼心理博弈,使得石头剪子布这个古老的游戏同时用于“意外”与“技术”两种特性,深受世界人民喜爱。
游戏规则:石头打剪刀,布包石头,剪刀剪布。
现在,需要你写一个程序来判断石头剪子布游戏的结果。
输入输入包括N+1行:第一行是一个整数N,表示一共进行了N次游戏。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计题目:中心对称字符串问题目录需求分析----------------------------------- 概要设计----------------------------------- 抽象收据定义------------------------------- 详细设计----------------------------------- 测试调试----------------------------------- 总结--------------------------------------- 参考文献-----------------------------------一、需求分析1、应用环境设定(1)问题描述有n个字符的字符串,用c或c++语言编写程序判断该字符串是否中心对称。
例如,abbccdccbba与abba都是中心对称的字符串。
(2)要求采用单链表数据结构或栈数据结构的方法实现上述问题的求解。
如果采用两种或两种以上数据结构实现者,可加分。
系统编程中使用的工具主要有PC机上的编程工具,业务系统是基于Windows 7上开发的,开发工具选择的是Microsoft Visual Studio SP6。
2、程序的用户界面命令行界面按照一定规律输入字符串,然后开始检验字符串3、输入方式字符数输入字符串4、输出方式输出判定结果字符串中心对称字符串中心不对称5、数据存储方式全部在内存存放,不使用硬盘上的文件或其他数据源,程序执行过程中和结束后不保存数据。
6、程序功能判定是否为对称字符串二、概要设计单链表数据结构:用链表存储字符串,将链表前半部分倒置与后半部分比较。
单链表和栈数据结构:用单链表存储字符串,将字符串前半部分进栈、出栈行成新的链表和原来有链表比较。
三、抽象数据定义单链表数据结构typedef struct linknode{char data;struct linknode *next;} point;创建链表,将链表前半部分倒置在前半部分行程的新链表和后半部分链表逐个比较元素比较单链表和栈数据抽象typedef struct node{char data;struct node* next;}LinkList;typedef struct{char *base; //栈顶指针(始终指向栈顶元素的下一个位置) char *top; //栈底指针(始终指向栈底)}stack;LinkList* create(char s[])构造单链表void InitStack(stack &s)构造空栈void push(stack &s,char e)进栈,将字符串前半部分进栈char pop(stack &s,char &e)出栈,弹出字符进行比较int judge(LinkList *head)判断单链表是否对称四、详细设计A)单链表数据结构流程图主要功能模块抽象数据定义指针typedef struct linknode{char data;struct linknode *next;} point;输入字符数、字符串int i,n=0;point *f,*p,*q,*h,*s;cout<<"Input the number of character string: ";cin>>n;cout<<endl<<"Input the character string: ";p=(point *)malloc(sizeof(point));q=p;前半部分字符串倒置for(i=1; i<=n-1; i++){q->next=(point *)malloc(sizeof(point));q=q->next;}cin>>q->data;q->next=NULL;f=p;p=NULL;i=0;s=f;while(i<(n/2)){q=s;s=s->next;q->next=p;p=q;i++;}字符串为奇数,忽略中间数if(n%2==1)p=p->next;elseq=s;h=p;逐个比较元素值while((p!=NULL)&&(q!=NULL)&&(p->data==q->data)) {p=p->next;q=q->next;}得到判断结果if((p==NULL)&&(q==NULL))cout<<"中心对称!";elsecout<<"中心不对称!";}A)调试测试B)栈的数据结构流程图主要功能设计定义单链表的结点类型typedef struct node{char data;struct node* next;}LinkList;根据输入的字符(存储在字数组中)建立一个不带结点的单链表LinkList* create(char s[]){LinkList *head,*newNode, //newNode*tail; //tailfor(int i=0;s[i]!='\0';i++){newNode=(LinkList*)malloc(sizeof(LinkList)); //新开一个结点newNode->data=s[i];newNode->next=NULL;if(i==0) //如果只输入了一个字符{head=newNode;tail=head;}else{tail->next=newNode; //把新开的结点连接到链表的最后一个结点上tail=newNode;}}return head;}定义栈的存储类型typedef struct{char *base;char *top;}stack;void InitStack(stack &s) //栈的初始化{s.base=(char*)malloc(max*sizeof(char));s.top=s.base;}void push(stack &s,char e) //进栈函数{*s.top++=e;}char pop(stack &s,char &e) //出栈函数{e=*--s.top ;return e;}判断以单链表存储的字符串是否对称的函数int judge(LinkList *head){stack s;char e;InitStack(s); //定义一个栈并初始化LinkList* p=head; //把头指针赋给p,即让p指向第一个结点 while(p !=NULL){push(s,p->data);p=p->next;}p=head;while(p!=NULL) //将栈中的元素弹出,逐个与链表中的元素比较(可以看成是把链表换个方向,然后与原来的链表比较)switch(judge(create(str))) //根据输入的字符串(存储在字符数组中)建立单链表然后进行判断B)调试测试五、总结:更深沉次的了解数据结构,是一次比较好的集中训练。
但是写代码之前先做好分析准备能够提高写代码的效率,写代码时回头看分析也能找出分析的不足。
主要收获:(1)保持良好的学习心态,第一,要有自信,自强,积极主动学习.第二,克服畏难情绪,树立学好程序设计的信心(2)要了解概念:VB程序设计本身并不复杂,变量,函数,条件语句,循环语句等概念较多.要真正能进行程序设计,就要深入理解这些概念.应该重视概念的学习.(3)自己动手编写程序,亲自动手进行程序设计是培养逻辑思维的好方法.因此我们得多动手编写程序,逐渐提高写程序的能力.自己动手,编写一些程序,才会有成就感,进而对课程产生兴趣,做起来才比较从容.等你在编写大量程序之后(4)上机调试程序应注意多问问同学,多问问老师、,把不懂的地方标出来。
(5)养成良好的编程习惯,第一,程序构思要有说明;第二,学会如何调试程序; 第三,对运行结果要做正确与否的分析。
参考文献:《数据结构》、《C语言程序设计》代码如下:单链表#include <iostream.h>#include <stdio.h>#include <stdlib.h>#include <malloc.h>typedef struct linknode{char data;struct linknode *next;} point;int main(){int i,n=0;point *f,*p,*q,*h,*s;cout<<"Input the number of character string: ";cin>>n;cout<<endl<<"Input the character string: ";p=(point *)malloc(sizeof(point));q=p;for(i=1; i<=n-1; i++){q->next=(point *)malloc(sizeof(point));q=q->next;}cin>>q->data;q->next=NULL;f=p; // f为指向字符串单链表的头指针p=NULL;i=0;s=f;while(i<(n/2)){ // 前半部分倒置q=s;s=s->next;q->next=p;p=q;i++;}if(n%2==1)p=p->next;elseq=s;h=p;while((p!=NULL)&&(q!=NULL)&&(p->data==q->data))// 逐个比较元素值p=p->next;q=q->next;}if((p==NULL)&&(q==NULL)) // 得到判断结果cout<<"中心对称!";elsecout<<"中心不对称!";}单链表和栈数据结构#include<stdio.h>#include<stdlib.h>#include<string.h>#define max 100//////////////////定义单链表的结点类型//////////////////// typedef struct node{char data;struct node* next;}LinkList;/////////////////根据输入的字符(存储在字数组中)建立一个不带结点的单链表/////////////LinkList* create(char s[]) //函数返回的类型为指针{LinkList *head, //头指针*newNode, //newNode始终指向新开的结点*tail; //tail始终指向链表中的最后一个结点for(int i=0;s[i]!='\0';i++){newNode=(LinkList*)malloc(sizeof(LinkList)); //新开一个结点newNode->data=s[i];newNode->next=NULL;if(i==0) //如果只输入了一个字符{head=newNode;tail=head;}else{tail->next=newNode; //把新开的结点连接到链表的最后一个结点上tail=newNode;}}return head;}////////////////////定义栈的存储类型////////////////////////// typedef struct{char *base; //栈顶指针(始终指向栈顶元素的下一个位置) char *top; //栈底指针(始终指向栈底)}stack;void InitStack(stack &s) //栈的初始化{s.base=(char*)malloc(max*sizeof(char));s.top=s.base;}void push(stack &s,char e) //进栈函数{*s.top++=e;}char pop(stack &s,char &e) //出栈函数{e=*--s.top ;return e;}///////////////判断以单链表存储的字符串是否对称的函数////////////////int judge(LinkList *head){stack s;char e;InitStack(s); //定义一个栈并初始化LinkList* p=head; //把头指针赋给p,即让p指向第一个结点while(p !=NULL){push(s,p->data);p=p->next;}p=head;while(p!=NULL) //将栈中的元素弹出,逐个与链表中的元素比较(可以看成是把链表换个方向,然后与原来的链表比较){if(p->data == pop(s,e))p=p->next;elsebreak; //如果不相等,说明不是对称,调处循环}if(p==NULL) return 1;else return 0;}void main(){char str[max]; //定义一个字符数组,用来存储输入的字符LinkList *h;while(1){printf("\n\n请输入字符串(输入cls清屏,exit退出):");gets(str);if(strcmp(str,"exit")==0) break;if(strcmp(str,"cls")==0) system("cls");switch(judge(create(str))) //根据输入的字符串(存储在字符数组中)建立单链表然后进行判断{case 1:printf("\n %s是中心对称的的字符串\n",str);break;case 0:printf("\n %s不是关于中心对称的\n",str);break;}}}。