题目
题目:回文单词
问题描述:
小明最近在读和深度学习技术相关的论文,因为论文大多使用英文撰写,所
以他读的很吃力。在学习过程中,他发现如果去掉一些单词的后缀,这些单词便
是回文串(即正读和反读一样的字符串)。于是他希望你能帮他删去单词后缀,
并判断这个单词是否是回文串。即如果一个单词以s、er、ly、ed、ing结尾,则
删去后缀(删去之后单词长度不为0),否则不做任何操作。删除后缀操作仅做
一次,比如一个单词以ered结尾,则只删去最后的ed。最后再判断新的字符串
是否是回文串。
输入格式:
一个仅包含小写字母的字符串,长度为len。
输出格式:
输出两行数据,第一行输出删除后缀后的新字符串,第二行输出Yes或No,
如果新字符串是回文串则输出Yes,否则输出No。
样例输入:
levels
样例输出:
level
Yes
样例说明:
由于levels 最后一个字符是s,符合题目对后缀的描述,于是删去s得到新
字符串level。显然level是个回文串,于是第二行输出Yes。
评测用例规模与约定:
1<len≤1000。
代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
short delete_suffixes(char * s, short *len, const char * suf,const short len_suf);
short palindrome_judge(char * s, short len);
int main()
{
char s[1001] = "";
gets(s);
short len = strlen(s);
delete_suffixes(s,&len,"s",1) || delete_suffixes(s,&len,"er",2) || delete_suffixes(s,&len,"ly",2) || delete_suffixes(s,&len,"ed",2) || delete_suffixes(s,&len,"ing",3);
puts(s);
if(palindrome_judge(s,len))
puts("Yes");
else
puts("No");
return 0;
}
short delete_suffixes(char * s, short *len, const char * suf,const short len_suf)
{
char *p = s + *len - 1;
for(char *q = suf + len_suf - 1;p >= s && q >= suf;p--,q--)
{
if(*p != *q)
{
return 0;
}
}
*++p = '\0';
*len -= len_suf;
return 1;
}
short palindrome_judge(char * s, short len)
{
char *p = s + len - 1;
for(;p > s;p--,s++)
{
if(*p != *s)
return 0;
}
return 1;
}
解释
delete_suffixes()
实现删除后缀功能,
||逻辑运算符有这样的特征:
对a||b:如果a为真,后面的b将不进行运算,并返回结果真;如果a为假,运算b,并返回b的值
所以让delete_suffixes()返回是否进行了删除,并让这些逻辑值进行或运算,便可以实现只删一次后缀的目的
另外,len是通过指针形式传入函数,是因为,如果进行了删除,需要对len进行更新
palindrome_judge
实现回文判断功能,首尾取个指针两头往中间动,逐个判断