xdoj-字符串-567-删除后缀后判断回文单词

发布于:2025-02-11 ⋅ 阅读:(48) ⋅ 点赞:(0)

题目

题目:回文单词
问题描述:
小明最近在读和深度学习技术相关的论文,因为论文大多使用英文撰写,所
以他读的很吃力。在学习过程中,他发现如果去掉一些单词的后缀,这些单词便
是回文串(即正读和反读一样的字符串)。于是他希望你能帮他删去单词后缀,
并判断这个单词是否是回文串。即如果一个单词以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

实现回文判断功能,首尾取个指针两头往中间动,逐个判断


网站公告

今日签到

点亮在社区的每一天
去签到