Lazarus讲义8(字符串)

更新时间:2024-05-21 13:20:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第八课 字符串

8.0 字符型数据复习 8.1 字符串类型 8.2 字符串类型例题 8.3 练习 8.0字符型数据复习:

1、 类型:char(有序型) 2、 定义:var a,b:char;

3、 占用空间:每个变量占用1个字节。每个变量只能存放一个字符。 4、 每个字符都有唯一对应的ASCII码。

0-9 A-Z a-z 48-57 65-90 97-122

5、相关函数: (1)Chr(i) 求ASCII码为i的字符 (2)Ord(a) 求字符的ASCII玛 (3)Pred(a) 求字符的前趋字符 (4)Succ(a) 求字符的后继字符 8.1字符串类型 我们把用两个单引号括起来的一串字符称为字符串。

字符型数据的每个变量只能存放一个字符,我们如何才能保存一个字符串呢? 很容易想到的是定义一个基类型为字符型的一维数组来保存。可是,在一般程序设计语 言中,都会有一种专门用于储存和处理字符串的变量类型,其原理和字符型一维数组完 全相同,并且定义了一些相应的专用运算命令,因此,使用起来远比字符型一维数组方 便。

一、基本概念:

1、类型名:sting(有序型) 2、定义:var s,st:string; (最大串长为默认的256) var s:string[20]; (指定最大串长为20) 3、占用空间:默认256字节,即最大串长256。如果指定最大串长为20,则占用20

个字节。注意:一个默认串长的字符串变量,哪怕是空串(一个字符都 没有),也要占用256个字节的内存空间。

4、引用方法: (1)整体引用: var s,s1:string; 1)读入一个串并保存到变量s中:

read(inf,s);或readln(inf,s);

注意:当前数据行中包括当前数据项在内的后面所有内容都将被作为一个串读

入,包括空格。 例如:有输入文件: abc 12 34 1

执行完上面语句后,s=’abc 12 34 1’,且读数指针移到最后。 再如:输入文件: 12 abc 34 1

执行语句read(inf,n,s,m,p); 结果为:n=12,s=’abc 34 1’,m、p没有读到值。

2)输出一个字符串: write(outf,s)或writeln(outf,s) 3) 给一个串变量赋值: s:=’’; (给字符串变量s赋一个空串,注意:空串不是空格串) s:=’ ’; (给字符串变量s赋由一个空格组成的空格串) s:=’abcdefg’; (给字符串变量s赋一个串) 4) 将一个字符串变量的值转赋给另一个字符串变量: s1:=s; (2)下标引用:由于字符串变量实质上就是一个基类型为字符型的一维数组,因

此,它也可以像一维数组一样,按下标进行调用和使用。

当我们按照下标进行使用时,每一个字符串单元就是一个字符型 变量,完全可以与其它字符型变量和常量进行各种运算和处理。

s:=’abcdefg’; s[2]:=’B’; write(s); aBcdefg write(s[4]); d s1[1]:=s[1]; s1[2]:=s[3]; write(s1); ac (注意:下标引用时,每个元素等同于一个字符型变量) 5、 字符串运算:

a) 布尔运算:比较字符串大小,按从前到后的顺序逐个比较字符串的ASCII码,

直到比出大小时停止。(与串长无关) 如:’a’>’bcdefg’, ‘abcdefg’>’abcdef’ b) 加法运算(字符串连接):将+号后面的串连接在+号前面的串的后面。(注意:

不遵守加法交换率) 如:’abcd’+’efg’=’abcdefg’, ‘efg’+’abcd’=’efgabcd’ 6、 相关函数和过程(专用运算):

什么是函数和过程:

函数和过程:是程序设计语言预先编制和封装好的(可能是相同语言也可能是其它

语言)、预留好接口(可以接收用户的初始值并返回运行结果)、具有 一定的特定功能的程序段,用户可以根据其名称和接口参数直接使用 这些程序段来完成自己程序中的任务,二不需要再自己重新编写相应 程序代码。

但是要注意:系统封装好的函数和过程中的程序代码是无法跟踪调试的。因此,在

使用单步运行命令时,只能使用F8进行调试。(F7:跟踪时遇到函数 和过程时,进入函数和过程,主要用于后面要学到的自定义函数和过 程;F8则不进入)

函数:

语法:函数名(参数表)

参数表:由常量、已赋值的变量、可计算出结果的表达式组成,每两项之间用

“,”间隔开。用于将函数运行需要的初始数据传递到函数内部。

运行结果:函数只能运算出一个结果(不能同时有多个结果),其结果有函数

名带回给用户。

使用方法:只可以用在各种表达式中。 例如:将字符’5’转变成数字5 var ch:char; n:integer; begin

ch:=’5’; n:=ord(ch)-48; end. 过程:

语法:过程名(参数表) 参数表:两部分

第一部分:和函数一样。 第二部分:由已定义说明的变量组成,用于接收过程运算产生的结果,

可以有多个。

每两个参数之间用一个“,”间隔开。

运行结果:过程可以运算出若干个结果(也可以是一个),但是过程名没有携

带结果返回的功能(即使只有一个运算结果),所有的结果都只能 通过参数表返回。

使用方法:相当于一条语句进行使用。 函数与过程的相同点:

(1)都是系统封装好的程序段,通过名字调用即可实现相应的功能,而不需

要再自己编写相应的代码。

(2)一般都有参数表,需要设置好参数才能正确使用。 函数与过程的不同点:

(1)功能有所不同,函数只能返回一个值(各种类型都可);过程则可以返回

0~n个结果。

(2)调用方式不同,函数出现在表达式中;过程直接当做一个语句来使用。 字符串专用函数和过程:(以下变量s为字符串变量)

提醒:以下所有函数和过程运算的时间复杂度均为O(n)(n为串长度)。 (1) 测字符串长度

类别:函数

语法:length(s)

参数:一个字符串变量

返回值:整型,表示字符串变量中保存的字符串的串长(即字符个数) 空串时返回值为0. 实例:

var s:string; i:integer; begin

s:=’abcdefg’; i:=length(s); write(i);

end. 输出结果:7

(2) 查找子串位置

类别:函数

功能:判断一个字符串中是否包含另一个字符串并查找第一次出现的位置 我们把包含另一个串的字符串称为母串,被包含的串称为字串。 语法:pos(s1,s2)

参数:两个串常量或串变量,s1为子串、s2为母串 返回值:整型。 如果母串中不包含字串,则返回0。

如果包含,则返回字串被包含时的第一个字母在母串中的位置。

实例:

var s,s1,s2:string; i,i1,i2:integer; ss:char; begin s:=’abcdefg’; s1:=’def’; s2:=’abd’; ss:=’c’; i:=pos(s1,s); i=4 i1:=pos(s2,s); i=0 i2:=pos(ss,s); i=3 end;

(3) 复制子串

类别:函数

功能:将母串中的一部分复制到另一个字符串变量中。 语法:copy(s,p,q) 参数:三个参数。 参数一:字符串型s(可以是串常量也可以是串变量) 参数二:整型p,需要被复制的子串首字符在母串中的位置。 参数三:整型q,需要被复制的子串的长度。 返回值:字符串型,即母串中p~q位置之间的字串。 实例:

var s,s1:string; begin s:=abcdefg’; s1:=copy(s,3,3); write(s1); end. 输出:cde

(4) 插入子串

类别:过程

功能:将一个字串插入到母串中的指定位置 语法:insert(s1,s,n); 参数:三个参数

参数一:字符串类型s1,需要插入到母串中去的字串。(传入) 参数二:字符串型变量s,被插入的母串(传入和返回共用)

参数三:整型n,在母串中的第n个位置插入字串s1,母串中原来第

n个位置及后面的字符向后平移。(传入)

返回值:仍保存在串变量s中的一个新串。

实例:

var s,s1:string; begin s:=’abefg’; s1:=’cd’; insert(s1,s,3); write(s); end. 输出:abcdefg

(5) 删除子串

类别:过程

功能:将一个字符串中一个字串删除。 语法:delete(s,n,m); 参数:三个参数 参数一:母串(传入和返回) 参数二:将要被删除的子串的首字符位置(传入) 参数二:将要被删除的子串长度(传入)

返回值:仍保存在串变量s中的一个新串。

实例:

var s:string; begin s:=’abcdefg’; delete(s,2,4); write(s); end. 输出:afg

(6) 数值转换成字符串

类别:过程

功能:将一个数值(可以是整型或实型)转换成相应字符串。 如:1234→’1234’、2.5→’2.5’、

7.000000000000000E+000→’ 7.000000000000000E+000’

语法:str(a,s); 参数:两个参数 参数一:数值型(整型或实型+格式符),表示需要被转换的数值。(传入) 参数二:字符串型,用于保存转换后的字符串。(返回) 返回值:保存在串变量s中的数字字符串。 实例:

var s,s1,s2:string; i:integer; m:real; begin

i:=1234; m:=1.5; str(I,s); writeln(s); 输出:1234 str(m,s1); writeln(s1); 输出:1.500000000000000E+000 str(m:3:1,s2); writeln(s2); 输出:1.5

end.

(7) 字符串转换成数值

类别:过程 功能:判断一个字符串能否被转换成数值(不包含非组成数字的非法字符),

如果能转换成功则转换成数值并保存在相应变量中。 字符串 转换成数值的类型 是否成功 转换结果 ‘1234’ 整型 是 1234 ‘1234’ 实型 是 1.23400??E003 ‘1.234’ 整型 否 无 ‘1.234’ 实型 是 1.23400??E000 ‘+1234’ 整型 是 1234 ‘-2.5E3’ 整型 否 无 ‘-2.5E3’ 实型 是 -2.50000??E003

‘a12’ 整型或实型 否 无 ‘1a2’ 整型或实型 否 无 ‘1+1’ 整型或实行 否 无 ’12 34’ 整型或实行 否 无 语法:val(s,n,code); 参数:三个参数 参数一:字符串型s,需要被转换的字符串。(传入) 参数二:数值型变量(整型或实型)n,用于保存转换成功时的数值。(返回) 参数三:整型变量code(需要程序预先说明),用于标志转换是否

成功。(返回)

返回值:如果转换成功,code返回值0,n返回转换结果。 如果转换不成功,n返回0,code返回第一个非法字符的位置。 实例:

var s,s1,s2,:string; i,code:integer; m:real; begin

s:=’1234’;

s1:=’1234+5678’; s2:=’12.34’;

val(s,i,code);

writeln(i); 输出:1234 writeln(code); 输出:0

val(s1,i,code); writeln(i); 输出:0 writeln(code); 输出:5

val(s2,m,code); writeln(m); 输出:1.234000000000000E+001 writeln(code); 输出:0

val(s2,i,code); writeln(i); 输出:0 writeln(code); 输出:3 end.

上述7种专用运算函数和过程,仅仅能够提供程序编写的方便,并不节省

程序运行的时间,在实现字符串的一些特殊运算时,有时候我们自己编写的程序段的效率可能比反复调用这些函数和过程在时间复杂度上更优。

二、扩充字符串型:ansistring(无限串长)

类型名:ansistring

定义:var s:ansistring;

占用空间:可变,根据所保存的字符串长度可以从0字节到2GB。 与string类型的区别:

(1)串长突破256限制,几乎可以达到无限长。

(2)注意:下标从0开始,而string类型下标从1开始。

(3)所有string类型可以进行的运算和函数、过程都适用于ansistring类型。但是

速度慢于string类型。

三、有关文件的函数: (1)Eof(inf):测文件inf读入指针是否到达文件末尾。True(false) (2)Eoln(inf):测文件inf的读数指针是否达到行末。

7.3 字符串类型例题 例1:读入如下的数据文件,计算各人的总分并按总分从高到低排序后输出。 5 Zhangsan 95 85 88 99 100 97 93 Lisi 99 87 90 85 84 89 94 Wangwu 98 88 99 100 100 94 88 Maliu 93 92 100 98 98 97 96 Liuor 90 94 95 86 90 84 92 分析:本题看似很简单,只要把名字读入到一个一维的字符串数组中,七科成绩读

入到另一个二维的整型数组中,然会进行排序(排序时两记录交换时不仅交 换二维数组,同时还要交换一维数组);但是如何实现读入呢?

假设s是基类型为字符串型的一维数组,用于保存姓名,a是保存成绩 的二维数组。我们使用

readln(inf,s[i],a[i,1],a[i,2],a[i,3],a[i,4],a[i,5],a[i,6],a[i,7])会怎么样? 结果是:读入字符串s[i]时,将整行全部当成字符串读入了,即: s[1]=’ Zhangsan 95 85 88 99 100 97 93’

这时,后面的a[i,1],a[i,2],a[i,3],a[i,4],a[i,5],a[i,6],a[i,7]将无数据可读。

只能采取:先把整行当做一个字符串读入,然后利用字符串函数和过程 将数据分离后再分别保存。

本题的方法必须熟练掌握,在竞赛中经常会遇到这种字符串处理。 处理的两种思路: 思路一:(1)查找母串中空格的位置p。 (2)将母串中1~p-1的子串复制出来,存入s中。 (3)删除母串中1~p子串。

(4)查找母串中空格的位置p。如果没有空格,转(8)。

(5)将母串中1~p-1的子串复制到串ss中,将ss转换成数值存

入a数组中。

(6)删除母串中1~p子串。 (7)转(4)重复。 (8)将母串转换成数值存入数组a。

(9)处理结束。

思路二:(1)查找母串中空格的位置p。 (2)将母串中1~p1的子串复制出来,存入s中。 (3)删除母串中1~p子串。

(4)将母串转换成数值,如果成功,转(8)。

(5)将母串中1~code-1的子串复制到串ss中,将ss转换成数值

存入a数组中。

(6)删除母串中1~code子串。 (7)转(4)重复。

(8)将母串转换成数值存入数组a。 (9)处理结束。

思路一标程:

program zifuchuan_ex1; const maxn=5; var inf,outf:text;

s:array[1..maxn]of string;

a:array[1..maxn,1..8]of integer; i,j,k,l,n,p,temp:integer; ss,sss:string; begin

assign(inf,'zifuchuan_ex1.in'); assign(outf,'zifuchuan_ex1.out'); reset(inf); rewrite(outf); readln(inf,n);

for i:=1 to n do

begin

l:=0;

readln(inf,ss); p:=pos(' ',ss);

s[i]:=copy(ss,1,p-1); delete(ss,1,p); for j:=1 to 7 do begin

p:=pos(' ',ss);

sss:=copy(ss,1,p-1); val(sss,a[i,j],k); l:=l+a[i,j]; delete(ss,1,p); end; a[i,8]:=l; end;

for i:=1 to n-1 do begin

temp:=a[i,8]; k:=i; for j:=i+1 to n do

if a[j,8]>temp then begin

temp:=a[j,8]; k:=j; end; for j:=1 to 8 do begin

temp:=a[k,j]; a[k,j]:=a[i,j]; a[i,j]:=temp; end;

sss:=s[k]; s[k]:=s[i]; s[i]:=sss; end;

for i:=1 to n do begin

write(outf,i,' ',s[i]);

for j:=1 to 8 do write(outf,' ',a[i,j]); writeln(outf); end; close(outf); end.

例2:读入一个整数,将其逆转成新的整数输出。 分析:过去我们用过数位分离法,实际上有了字符串后,我们可以把整数当成字

符串读入,按位调用即可分离数位了。 program zifuchuan_ex2;

五、练习:

1、 读入一段英文短文(不超过255个字符),统计其中26个英文字母各自出现的次数。 2、 读入一段英文短文(不超过255个字符),统计其中单词的个数。 3、 读入一字串(长度不大于50),删去字串中相同的字符。

4、 接收一个任意长度的字串(小于100个字符),将该字符串中的字符按照ASCII码

表从小到大的顺序重新排列形成一个新的字符串并打印出来。 5、 在两个字符串中,找出一个长度最长的公共子串。 6、 判断输入的一个字符串是否是回文。

7、 编制一个能进行二元数学运算的程序,如:输入:2+3,输出答案:5;

输入:2*4,输出答案:8

9、字符串编辑

从键盘输入一个字符串(长度<=40个字符),并以字符 ’.’ 结束。 例如:’This is a book.’ 现对该字符串进行编辑,编辑功能有:

D:删除一个字符,命令的方式为: D a 其中a为被删除的字符

例如:D s 表示删除字符 ’s’ ,若字符串中有多个 ‘s’,

则删除第一次出现的。

如上例中删除的结果为: ‘Thi is a book.’ I:插入一个字符,命令的格式为:

I a1 a2 其中a1表示插入到指定字符前面,a2表示将要插入的字符。

例如:I s d 表示在指定字符 ’s’ 的前面插入字符 ‘d’ ,若原串中有多个 ‘s’ ,则插入在最后一个字符的前面,如上例中: 原 串:’This is a book.’

插入后:’This ids a book.’

var inf,outf:integer; i,l:integer; s:string;

a:array[1..256]of byte; begin

assign(inf,'zifuchuan_ex2.in'); assign(outf,'zifuchuan_ex2.out'); reset(inf); rewrite(outf); readln(inf,s); l:=length(s);

for i:=l downto 1 do write(outf,s[i]); close(outf); end.

例3:读入一段英文,统计其中各英文字母出现的频率,并按从高到低输出。 分析:(1)首先要把各字母出现的次数统计出来,可以采用下标类型为字符型的

数组作为计数器,a[‘a’]记录字母a出现的次数,b[‘A’]记录字母A出 现的次数。

(2)然后把大小写字母出现的次数合并。 (3)对统计出来的频率进行排序(我们在这里采用统排法)

R:替换一个字符,命令格式为:

R a1 a2 其中a1为被替换的字符,a2为替换的字符,若在原串中有多个a1则

应全部替换。

例如: 原 串: ‘This is a book.’

输入命令:R o e

替换后的字符串为: ‘This is a beek.’

在编辑过程中,若出现被改的字符不存在时,则给出提示信息。 8、 计算器改良:

NCL是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能。实验室将这个任务交给了一个刚进入的新手ZL先生。为了很好的完成这个任务,ZL先生首先研究了一些一元一次方程的实例:

4+3x=8

6a-5+1=2-2a -5+12y=0

ZL先生被主管告之,在计算器上键入的一个一元一次方程中,只包含整数、小写字母及+、-、=这三个数学符号(当然,符号“─”既可作减号,也可作负号)。方程中并没有括号,也没有除号,方程中的字母表示未知数。

编写程序,解输入的一元一次方程, 将解方程的结果(精确至小数点后三位)输出 9、 乒乓球

【问题背景】国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及。其中11分制改革引起了很大的争议,有一部分球员因为无法适应新规则只能选择退役。华华就是其中一位,他退役之后走上了乒乓球研究工作,意图弄明白11分制和21分制对选手的不同影响。在开展他的研究之前,他首先需要对他多年比赛的统计数据进行一些分析,所以需要你的帮忙。

【问题描述】华华通过以下方式进行分析,首先将比赛每个球的胜负列成一张表,然后分别计算在11分制和21分制下,双方的比赛结果(截至记录末尾)。

比如现在有这么一份记录,(其中W表示华华获得一分,L表示华华对手获得一分):

WWWWWWWWWWWWWWWWWWWWWWLW 在11分制下,此时比赛的结果是华华第一局11比0获胜,第二局11比0获胜,正在进行第三局,当前比分1比1。而在21分制下,此时比赛结果是华华第一局21比0获胜,正在进行第二局,比分2比1。如果一局比赛刚开始,则此时比分为0比0。

你的程序就是要对于一系列比赛信息的输入(WL形式),输出正确的结果。

【输入格式】每个输入文件包含若干行字符串(每行至多20个字母),字符串有大写的W、L和E组成。其中E表示比赛信息结束,程序应该忽略E之后的所有内容。

【输出格式】输出由两部分组成,每部分有若干行,每一行对应一局比赛的比分(按比赛信息输入顺序)。其中第一部分是11分制下的结果,第二部分是21分制下的结果,两部分之间由一个空行分隔。

【输入样例】

WWWWWWWWWWWWWWWWWWWW WWLWE

【输出样例】 11:0 11:0 1:1 21:0 2:1

10、 侦探推理:

明明同学最近迷上了侦探漫画《柯南》并沉醉于推理游戏之中,于是他召集了一群同学玩推理游戏。游戏的内容是这样的,明明的同学们先商量好由其中的一个人充当罪犯(在明明不知情的情况下),明明的任务就是找出这个罪犯。接着,明明逐个询问每一个同学,被询问者可能会说:

证词中出现的其他话,都不列入逻辑推理的内容。

明明所知道的是,他的同学中有N个人始终说假话,其余的人始终说真。 现在,明明需要你帮助他从他同学的话中推断出谁是真正的凶手,请记住,凶手只有一个!

【输入格式】

输入由若干行组成,第一行有二个整数,M(1≤M≤20)、N(1≤N≤M)和P(1≤P≤100);

M是参加游戏的明明的同学数,N是其中始终说谎的人数,P是证言的总数。接下来M行,

每行是明明的一个同学的名字(英文字母组成,没有主格,全部大写)。

往后有P行,每行开始是某个同学的名宇,紧跟着一个冒号和一个空格,后面是一句证词,符合前表中所列格式。证词每行不会超过250个字符。 输入中不会出现连续的两个空格,而且每行开头和结尾也没有空格。

【输出格式】

如果你的程序能确定谁是罪犯,则输出他的名字;如果程序判断出不止一个人可能是

罪犯,则输出 Cannot Determine;如果程序判断出没有人可能成为罪犯,则输出

Impossible。

【输入样例】 3 1 5 MIKE CHARLES KATE

MIKE:I am guilty.

MIKE:Today is Sunday.

CHARLES:MIKE is guilty. KATE:I am guilty. KATE:How are you??

【输出样例】 MIKE

11、 谁拿了最多奖学金

【问题描述】

某校的惯例是在每学期的期末考试之后发放奖学金。发放的奖学金共有五种,获取的条件各自不同:

1) 院士奖学金,每人8000元,期末平均成绩高于80分(>80),并且在本学期内发表1篇或1篇以上论文的学生均可获得;

2) 五四奖学金,每人4000元,期末平均成绩高于85分(>85),并且班级评议成绩高于80分(>80)的学生均可获得;

3) 成绩优秀奖,每人2000元,期末平均成绩高于90分(>90)的学生均可获得;

4) 西部奖学金,每人1000元,期末平均成绩高于85分(>85)的西部省份学生均可获得;

5) 班级贡献奖,每人850元,班级评议成绩高于80分(>80)的学生干部均可获得;

只要符合条件就可以得奖,每项奖学金的获奖人数没有限制,每名学生也可以同时获得多项奖学金。例如姚林的期末平均成绩是87分,班级评议成绩82分,同时他还是一位学生干部,那么他可以同时获得五四奖学金和班级贡献奖,奖金总数是4850元。

现在给出若干学生的相关数据,请计算哪些同学获得的奖金总数最高(假设总有同学能满足获得奖学金的条件)。 【输入文件】

输入文件scholar.in的第一行是一个整数N(1 <= N <= 100),表示学生的总数。接下来的N行每行是一位学生的数据,从左向右依次是姓名,期末平均成绩,班级评议成绩,是否是学生干部,是否是西部省份学生,以及发表的论文数。姓名是由大小写英文字母组成的长度不超过20的字符串(不含空格);期末平均成绩和班级评议成绩都是0到100之间的整数(包括0和100);是否是学生干部和是否是西部省份学生分别用一个字符表示,Y表示是,N表示不是;发表的论文数是0到10的整数(包括0和10)。每两个相邻数据项之间用一个空格分隔。

【输出文件】

输出文件scholar.out包括三行,第一行是获得最多奖金的学生的姓名,第二行是这名学生获得的奖金总数。如果有两位或两位以上的学生获得的奖金最多,输出他们之中在输入文件中出现最早的学生的姓名。第三行是这N个学生获得的奖学金的总数。 【样例输入】

4

YaoLin 87 82 Y N 0 ChenRuiyi 88 78 N Y 1 LiXin 92 88 N N 0

ZhangQin 83 87 Y N 1 【样例输出】

ChenRuiyi 9000 28700

12、 字符串的展开 【问题描述】

在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于“d-h”或者“4-8”的字串,我们就把它当作一种简写,输出时,用连续递增的字母获数字串替代其中的减号,即,将上面两个子串分别输出为“defgh”和“45678”。在本题中,我们通过增加一些参数的设置,使字符串的展开更为灵活。具体约定如下:

(1) 遇到下面的情况需要做字符串的展开:在输入的字符串中,出现了减号“-”,减号两侧同为小写字母或同为数字,且按照ASCII码的顺序,减号右边的字符严格大于左边的字符。

(2) 参数p1:展开方式。p1=1时,对于字母子串,填充小写字母;p1=2时,对于字母子串,填充大写字母。这两种情况下数字子串的填充方式相同。p1=3时,不论是字母子串还是数字字串,都用与要填充的字母个数相同的星号“*”来填充。

(3) 参数p2:填充字符的重复个数。p2=k表示同一个字符要连续填充k个。例如,当p2=3时,子串“d-h”应扩展为“deeefffgggh”。减号两边的字符不变。

(4) 参数p3:是否改为逆序:p3=1表示维持原来顺序,p3=2表示采用逆序输出,注意这时候仍然不包括减号两端的字符。例如当p1=1、p2=2、p3=2时,子串“d-h”应扩展为“dggffeeh”。

(5) 如果减号右边的字符恰好是左边字符的后继,只删除中间的减号,例如:“d-e”应输出为“de”,“3-4”应输出为“34”。如果减号右边的字符按照ASCII码的顺序小于或

等于左边字符,输出时,要保留中间的减号,例如:“d-d”应输出为“d-d”,“3-1”应输出为“3-1”。 【输入】

输入文件expand.in包括两行:

第1行为用空格隔开的3个正整数,一次表示参数p1,p2,p3。

第2行为一行字符串,仅由数字、小写字母和减号“-”组成。行首和行末均无空格。 【输出】

输出文件expand.out只有一行,为展开后的字符串。 【输入输出样例1】 expand.in 1 2 1 abcs-w1234-9s-4zz 【输入输出样例2】 expand.in 2 3 2 a-d-d 【输入输出样例3】 expand.in 3 4 2 di-jkstra2-6 【限制】

40%的数据满足:字符串长度不超过5

100%的数据满足:1<=p1<=3,1<=p2<=8,1<=p3<=2。字符串长度不超过100 15、Y型项链(Necklace)

欢乐岛上众多新奇的游乐项目让小可可他们玩的非常开心。现在他们正在玩比赛串项链的游戏,谁串的最快就能得到优厚的奖品。这可不是普通的项链,而是一种Y型项链,项链的最中间有一颗大珍珠作为结合点,从大珍珠上连出来3条由各种宝石串起来的链子。比赛的规则是这样的:每次可以从三条链子中某一条的一端取下来一个宝石,或者安上去一个宝石,称为一次操作,经过若干次操作,最终使得三条链子完全相同。想要赢得比赛,那么

expand.out dijkstra2************6 expand.out aCCCBBBd-d expand.out abcsttuuvvw1234556677889s-4zz 只能使用尽量少的操作次数。假设每种宝石都有无数多个以供使用,且链子足够长。你能帮助小可可赢得比赛吗?

注:由于对Y型项链的宝石数没有特殊的要求,所以即使你把所有宝石都取下来,也是一个可以接受的方案(三根没有串宝石的绳子也是完全一样的)。

输入:一共有3行,表示Y型项链的三条链子,每行开始有一个数字N,表示初始时这条

链子上串有N个宝石(N<=50),随后是一个空格,然后是N个'A'和'Z'之间的字符,表示这个链子上的宝石,每个字母表示一种不同的宝石,这个字符串最左边的字符表示的是离大珍珠最近的那个宝石,而最右边的表示的是在链子末端的宝石。 输出:只有一个整数,表示所需要的最少的操作次数。 样例:

输入:

3 CAT 3 TAC 5 CATCH 输出:

8

提示:100%的数据中,N<=50。 50%的数据中,N<=20。

只能使用尽量少的操作次数。假设每种宝石都有无数多个以供使用,且链子足够长。你能帮助小可可赢得比赛吗?

注:由于对Y型项链的宝石数没有特殊的要求,所以即使你把所有宝石都取下来,也是一个可以接受的方案(三根没有串宝石的绳子也是完全一样的)。

输入:一共有3行,表示Y型项链的三条链子,每行开始有一个数字N,表示初始时这条

链子上串有N个宝石(N<=50),随后是一个空格,然后是N个'A'和'Z'之间的字符,表示这个链子上的宝石,每个字母表示一种不同的宝石,这个字符串最左边的字符表示的是离大珍珠最近的那个宝石,而最右边的表示的是在链子末端的宝石。 输出:只有一个整数,表示所需要的最少的操作次数。 样例:

输入:

3 CAT 3 TAC 5 CATCH 输出:

8

提示:100%的数据中,N<=50。 50%的数据中,N<=20。

本文来源:https://www.bwwdw.com/article/fdf7.html

Top