字符串回文现象的递归判断

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

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

首先我们要考虑使用递归的两个条件:澳门赌场玩法

  • 第一:这个问题是否可以分解为形式相同但规模更小的问题?
  • 第二:如果存在这样一种分解,那么这种分解是否存在一种简单情境?

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

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

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

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

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

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

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

01 #include "stdio.h"
02 #include "string.h"
03  
04 int main(void)
05 {
06     int n, rs;
07     char str[50];
08  
09     printf("请输入需要判断回文的字符串:");
10     scanf("%s",&str);
11  
12     n = (int)strlen(str);
13     rs = is_palindereme(str, n);
14     printf("%d ", rs);
15 }
16  
17 int is_palindereme(char *str, int n)
18 {
19     printf("Length: %d \n",n);
20     printf("%c ----- %c\n", str[0], str[n-1]);
21     if(n == 0 || n == 1)
22         return 1;
23     else{
24         //printf("%d, %d\n", str[0], str[n-1]);
25         return ((str[0] == str[n-1]) ? is_palindereme(str+1, n-2) : 0);
26     }
27 }

程序运行结果为:

view source

print?

1 请输入需要判断回文的字符串:level
2 Length: 5
3 l ----- l
4 Length: 3
5 e ----- e
6 Length: 1
7 v ----- v
8 1
时间: 2024-08-01 20:39:32

字符串回文现象的递归判断的相关文章

暑假集训7.11 字符串回文暴力

#include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; typedef unsigned long long ull; #define MM(a,b) memset(a,b,sizeof(a)); const double eps = 1e-10; const int i

Java实验--关于简单字符串回文的递归判断实验

首先题目要求写的是递归的实验,一开始没注意要求,写了非递归的方法.浪费了一些时间,所谓吃一堑长一智.我学习到了以后看实验的时候要认真看实验中的要求,防止再看错. 以下是对此次的实验进行的分析: 1)递归是运用到了栈的思想 2)回文是一段从中间开始倒置的文字,回代的过程中出现不同的符号的时候就说明这段文字不是回文了 根据上面对回文判断的分析,就拿最简单的121来说,要每个字符判断直至2所在的位置,然后依次回代判断前面的1和后面的1的位置(上述的描述就类似于栈的思想). 有关于栈还有递归其实我并不熟

说一下前天腾讯实习的笔试题--字符串回文问题(动态规划)

题目描述 最长回文子序列: 一个给定的字符串,求其最长回文子序列的长度; 一个回文子序列定义为原字符串的一个子序列去掉某些字符后生成的字符串为一个回文字符串; 例如cabbeaf:回文子序列有:c,a,aa,bb,,aba,abba,e,f,最长的就是abba,所以输出长度为4. 解题思路: 该问题为一个典型的动态规划问题,原串和反转串的最长公共子序列的长度即为该问题的解. 我实现的代码如下(我还多写了一些代码,用递归的方法来求解出了最长公共子序列的字符串): 1 #include <stdio

纪念逝去的岁月——C/C++字符串回文

判断字符串是否是回文: 1. 输入:hello world dlrow olleh 输出:1 2. 输入:nihao hello 输出:0 代码 #include <stdio.h> #include <string.h> int palindrome(char * p) { if(NULL == p) { return 0; } int iLen = strlen(p); int iHalf = iLen / 2; int i = 0, iEnd = iLen - 1; for(

[网易]字符串回文分割

[题目] 将一个很长的字符串,分割成一段一段的子字符串,子字符串都是回文字符串.有回文字符串就输出最长的,没有回文就输出一个一个的字符. 例如:habbafgh 输出h,abba,f,g,h. [思路一] 基于"最长回文子串算法"求出当前字符串的最长回文子串,就可以分成3部分 a.最长回文子串left部分 b.最长回文子串 c.最长回文子串right部分 然后分别求a和c的最长回文子串 递归至每部分都成单个字符+当前最长回文子串,就可以分解成最终结果. [代码一] #include&l

算法模板——线段树8 (字符串回文变换)

实现功能:输入一个长度为N的由26个大写字母组成的字符串,输入M条指令:"1 x y",将x到y的字串重组构成一个字典序最小的回文串,如果不能构成回文串输出False,否则True并完成变换:"2 x y"输出从x到y的子串:"3 x y t"将x到y的所有字全部变成chr(t+64)(即对应大写字母) 原理:用一个数组维护字母个数即可,然后再附带一个带tag的区间覆盖操作,实现回文串的重组 1 type 2 vec=array[0..26] o

回文数-时间变换-判断邮箱

class huiwenshu public class huiwenshu { public static void main(String[] args) { System.out.println("输入..."); Scanner in = new Scanner(System.in); String number = in.next(); boolean flag = true; for(int i=0;i<number.trim().length()/2;i++){ i

hdu 1544 求字符串回文

#include <stdio.h> #include <string.h> int pal(char *str) { int len = strlen(str); int l, r; int ans = len; for(int i=0; i<len; i++) { l = i-1; r = i+1; while(l >= 0 && r < len && str[l] == str[r]) {l--; r++; ans++;} l

字符串-回文数

问题描述 1221是一个非常特殊的数,它从左边读和从右边读是一样的,编程求所有这样的四位十进制数.输出格式: 按从小到大的顺序输出满足条件的四位十进制数. 代码如下: 1 #include <iostream> 2 using namespace std; 3 4 int main() 5 { 6 for(int i=1000;i<=9999;i++) 7 { 8 if((i/1000==i%10)&&(i/100%10==i/10%10)) 9 { 10 cout &l