回文串

作者: 董玉恒_算法训练营 | 来源:发表于2019-03-06 10:08 被阅读0次

本篇转载于《漫谈递归:递归的思想》

前面谈到了递归的一些思想,还有概念上的一些理解,这里试着用递归解决一些问题。比如回文。

回文是一种字符串,它正着读和反着读都是一样的。比如level,eye都是回文。用迭代的方法可以很快地判断一个字符串是否为回文。用递归的方法如何来实现呢?

首先我们要考虑使用递归的两个条件:

第一:这个问题是否可以分解为形式相同但规模更小的问题?

第二:如果存在这样一种分解,那么这种分解是否存在一种简单情境?

先来看第一点,是否存在一种符合条件的分解。容易发现,如果一个字符串是回文,那么在它的内部一定存在着更小的回文。 比如level里面的eve也是回文。 而且,我们注意到,一个回文的第一个字符和最后一个字符一定是相同的。

所以我们很自然的有这样的方法:

先判断给定字符串的首尾字符是否相等,若相等,则判断去掉首尾字符后的字符串是否为回文,若不相等,则该字符串不是回文。 

注意,我们已经成功地把问题的规模缩小了,去掉首尾字符的字符串当然比原字符串小。

接着再来看第二点, 这种分解是否存在一种简单情境呢?简单情境在使用递归的时候是必须的,否则你的递归程序可能会进入无止境的调用。

对于回文问题,我们容易发现,一个只有一个字符的字符串一定是回文,所以,只有一个字符是一个简单情境,但它不是唯一的简单情境,因为空字符串也是回文。这样,我们就得到了回文问题的两个简单情境:字符数为1和字符数为0。

好了,两个条件都满足了,基于以上分析,我们可以很容易的编写出解决回文问题的递归实现方式:

#include "stdio.h"

#include "string.h"

int main(void)

{

    int n, rs;

    char str[50];

    printf("请输入需要判断回文的字符串:");

    scanf("%s",&str);

    n = (int)strlen(str);

    rs = is_palindereme(str, n);

    printf("%d ", rs);

}

int is_palindereme(char *str, int n)

{

    printf("Length: %d \n",n);

    printf("%c ----- %c\n", str[0], str[n-1]);

    if(n == 0 || n == 1)

        return 1;

    else{

        //printf("%d, %d\n", str[0], str[n-1]);

        return ((str[0] == str[n-1]) ? is_palindereme(str+1, n-2) : 0);

    }

}

相关文章

  • 最长回文子串杀器-马拉车算法 2020-09-07(未允禁转)

    1.求解最长回文子串 在之前博客中提到解决回文串问题时,是利用了大回文串 = 小回文串向两头扩展的性质得到状态转移...

  • 最长回文子串

    判断是否是回文字符串 获取所有可能子串 获取所有回文子串 进阶

  • 字符串问题合集

    1. 验证回文串 题目描述: 输入一个字符串,只关注字母和数字,判断字符串是否为回文串。空字符串也可以认为是回文串...

  • 删除部分字符使其变成回文串-最长公共子序列

    给定一个字符串str,删除部分字符使其变成回文串,问最少删除多少字符可以变成回文串,即最长回文串。(腾讯笔试题) ...

  • 判断给定字符串是否为回文串

    题目:判断规定字符串是否为回文串。 首先我们应该理解什么是回文串。回文串就是从正面读和反面读是一样的字符串,比如l...

  • C++ 计算字符串中的回文串数量

    回文串对于给定的一个字符串,要求求出多少个子串是回文串。子串:字符串中连续的长度大于0的一段。回文串:若字符串的倒...

  • 四种方法求最长回文串

    所谓回文串,就是正着读和倒着读结果都一样的回文字符串。比如:a, aba, abccba都是回文串,ab, abb...

  • 最长回文子串

    最长回文子串——Manacher 算法 1. 问题定义 最长回文字符串问题:给定一个字符串,求它的最长回文子串长度...

  • C语言实现求最长回文子串

    最长回文子串的概念 回文串是指正序和反序都一样的字符串,例如:Str1 = "AbbA",则Str1的最长回文子串...

  • 关于回文问题

    回文问题的解法:双指针,栈,reverse 1. 409. 最长回文串[✔]2. 125. 验证回文串[✔]3. ...

网友评论

      本文标题:回文串

      本文链接:https://www.haomeiwen.com/subject/tgnzuqtx.html