【字符串处理算法】回文判断的算法设计及C代码实现

开发 开发工具 算法
今天主要讲讲回文判断的算法设计及C代码实现。

一、需求描述

输入一个字符串,编写程序判断这个字符串是否是回文串。

为了便于说明,设定输入的字符串分为中文字符串和非中文字符串两种。其中,中文字符串中仅包含中文字符,非中文字符串中不包含中文字符。

所谓回文串,是指正读和反读都一样的字符串。下面举几个例子予以说明:

1.“level”是一个非中文字符的回文串,因为正读和反读都是“level”。

2.“Good”不是一个非中文字符的回文串。

3.“我爱我”是一个中文字符的回文串,因为正读和反读都是“我爱我”。

4.“我爱你”不是一个中文字符的回文串。

字符串

二、算法设计

对于非中文字符的回文串的判断比较简单,我们只要以字符串的中间为原点,比较前后对应的字符是否相等就可以了;但对于中文字符的回文串的判断要复杂一点,因为一个中文字符占两个字节,我们不能采用非中文字符的回文串的判断方法,而是应该先单独获取每个中文字符,然后再比较一前一后两个字符是否相等。

程序的总体流程如图1所示。

图1 程序的总体流程

三、特殊流程考虑

在编写程序的过程中,我们要对输入的字符串的长度及格式多做考虑,如:

1.如果输入的字符串中只有一个字符,那么程序直接返回,不执行后续流程,因为回文串中至少有两个及以上的字符。

2.如果输入的中文串中含有非中文字符,或者是输入的非中文串中含有中文字符,那么程序直接返回,不执行后续流程。

四、程序代码

 
  1. /********************************************************************** 
  2. * 版权所有 (C)2016, Zhou Zhaoxiong。 
  3. * 文件名称: PalindromicString.c 
  4. * 文件标识: 无 
  5. * 内容摘要: 回文判断 
  6. * 其它说明: 形如madam, php, 2992, 1234321这样的串就是回文串 
  7. * 当前版本: V1.0 
  8. * 作    者: Zhou Zhaoxiong 
  9. * 完成日期: 20160222 
  10. **********************************************************************/ 
  11. #include <stdio.h> 
  12.  
  13.  
  14. // 重新定义数据类型 
  15. typedef signed   char  INT8; 
  16. typedef          int   INT32; 
  17. typedef unsigned int   UINT32; 
  18.  
  19. // 全局变量声明, 用于存放汉字, ***支持100个汉字 
  20. INT8   gszStrCharArray[101][5] = {0};   
  21. UINT32 giCharNum               = 0
  22.  
  23.  
  24. // 函数声明 
  25. void JudgePalindromicString(INT8 *pszInputStr, UINT32 iInputStrLen, UINT32 iStrType); 
  26. void GetChineseChars(INT8 *pszInputStr); 
  27. INT32 JudgeStrFormat(INT8 *pszInputStr, UINT32 iStrType); 
  28.  
  29.  
  30. /********************************************************************** 
  31. * 功能描述: 主函数 
  32. * 输入参数: 无 
  33. * 输出参数: 无 
  34. * 返 回 值: 0-执行成功   其它-执行失败 
  35. * 其它说明: 无 
  36. * 修改日期        版本号     修改人            修改内容 
  37. * --------------------------------------------------------------------- 
  38. * 20160222        V1.0     Zhou Zhaoxiong      创建 
  39. ***********************************************************************/ 
  40. INT32 main() 
  41.     UINT32 iStrType        = 0
  42.     INT32  iRetVal         = 0
  43.     INT8   szInputStr[100] = {0}; 
  44.  
  45.     printf("Please input the string type(1:中文字符串,2:非中文字符串): \n"); 
  46.     scanf("%d", &iStrType); 
  47.      
  48.     printf("Please input the string: \n"); 
  49.     scanf("%s", szInputStr); 
  50.  
  51.     // 判断输入的字符串是中文字符串或者是非中文字符串 
  52.     iRetVal = JudgeStrFormat(szInputStr, iStrType); 
  53.     if (iRetVal != 0) 
  54.     { 
  55.         return -1; 
  56.     } 
  57.  
  58.     if (iStrType == 1)     // 如果输入的是中文串, 则先获取各个中文字符 
  59.     { 
  60.         GetChineseChars(szInputStr); 
  61.  
  62.         if (giCharNum <= 1)    // 只输入了一个字符, 直接返回 
  63.         { 
  64.             printf("%s has only one character, please check!\n", szInputStr); 
  65.             return -1;  
  66.         } 
  67.     } 
  68.     else if (iStrType == 2) 
  69.     { 
  70.         if (strlen(szInputStr) <= 1)  // 只输入了一个字符, 直接返回 
  71.         { 
  72.             printf("%s has only one character, please check!\n", szInputStr); 
  73.             return -1;  
  74.         } 
  75.     } 
  76.   
  77.     // 判断输入的字符串是否为回文串 
  78.     JudgePalindromicString(szInputStr, strlen(szInputStr), iStrType); 
  79.  
  80.     return 0;             
  81.  
  82.  
  83. /********************************************************************** 
  84. * 功能描述:判断输入的字符串是否为回文串 
  85. * 输入参数:pszInputStr-输入的字符串 
  86.             iInputStrLen-输入的字符串的长度 
  87.             iStrType-输入的字符串的类型 
  88. * 输出参数:无 
  89. * 返 回 值:无 
  90. * 其它说明:无 
  91. * 修改日期       版本号        修改人          修改内容 
  92. * ------------------------------------------------------------------- 
  93. * 20160222       V1.0      Zhou Zhaoxiong      创建 
  94. ***********************************************************************/ 
  95. void JudgePalindromicString(INT8 *pszInputStr, UINT32 iInputStrLen, UINT32 iStrType) 
  96.     UINT32 iPosFlag   = 0
  97.  
  98.     if (NULL == pszInputStr) 
  99.     { 
  100.         return; 
  101.     } 
  102.  
  103.     if (iStrType == 1)     // 中文字符串 
  104.     { 
  105.         for (iPosFlag = 0; iPosFlag < giCharNum/2; iPosFlag ++) 
  106.         { 
  107.             if (strcmp(gszStrCharArray[iPosFlag], gszStrCharArray[giCharNum-1-iPosFlag]) != 0)   // 有对应字符不相等 
  108.             { 
  109.                 printf("%s is not a palindromic string!\n", pszInputStr); 
  110.                 return; 
  111.             } 
  112.         } 
  113.     } 
  114.  
  115.     if (iStrType == 2)     // 非中文字符串 
  116.     { 
  117.         // 从中间分开, 一前一后两个字符互相比较, 如果全部对应相等, 则是回文串 
  118.         for (iPosFlag = 0; iPosFlag < iInputStrLen/2; iPosFlag ++) 
  119.         { 
  120.             if (pszInputStr[iPosFlag] != pszInputStr[iInputStrLen-1-iPosFlag])   // 有对应字符不相等 
  121.             { 
  122.                 printf("%s is not a palindromic string!\n", pszInputStr); 
  123.                 return; 
  124.             } 
  125.         } 
  126.     } 
  127.  
  128.     printf("%s is a palindromic string!\n", pszInputStr); 
  129.  
  130.     return; 
  131.  
  132.  
  133. /********************************************************************** 
  134. * 功能描述:获取输入的字符串中的每个中文字符 
  135. * 输入参数:pszInputStr-输入的字符串 
  136.             iInputStrLen-输入的字符串的长度 
  137. * 输出参数:无 
  138. * 返 回 值:无 
  139. * 其它说明:无 
  140. * 修改日期       版本号        修改人          修改内容 
  141. * ------------------------------------------------------------------- 
  142. * 20160222       V1.0      Zhou Zhaoxiong      创建 
  143. ***********************************************************************/ 
  144. void GetChineseChars(INT8 *pszInputStr) 
  145.     UINT32 iPosFlag = 0
  146.      
  147.     if (NULL == pszInputStr) 
  148.     { 
  149.         return; 
  150.     } 
  151.  
  152.     memset(gszStrCharArray, 0x00, sizeof(gszStrCharArray)); 
  153.     giCharNum = 0
  154.      
  155.     while (iPosFlag < strlen(pszInputStr)) 
  156.     { 
  157.         snprintf(gszStrCharArray[giCharNum], sizeof(gszStrCharArray[giCharNum])-1, "%c%c", pszInputStr[iPosFlag], pszInputStr[iPosFlag+1]); 
  158.  
  159.         iPosFlagiPosFlag = iPosFlag + 2;    // 每个中文字符占两个字节 
  160.          
  161.         giCharNum ++; 
  162.     } 
  163.  
  164.  
  165. /********************************************************************** 
  166. * 功能描述:判断输入的字符串的格式是否正确 
  167. * 输入参数:pszInputStr-输入的字符串 
  168.             iStrType-输入的字符串的类型 
  169. * 输出参数:无 
  170. * 返 回 值:0-格式正确 其它-格式不正确 
  171. * 其它说明:无 
  172. * 修改日期       版本号        修改人          修改内容 
  173. * ------------------------------------------------------------------- 
  174. * 20160222       V1.0      Zhou Zhaoxiong      创建 
  175. ***********************************************************************/ 
  176. INT32 JudgeStrFormat(INT8 *pszInputStr, UINT32 iStrType) 
  177.     UINT32 iPosFlag  = 0
  178.      
  179.     if (NULL == pszInputStr) 
  180.     { 
  181.         return -1; 
  182.     } 
  183.  
  184.     if (iStrType == 1)    // 先判断中文字符串 
  185.     { 
  186.         for (iPosFlag = 0; iPosFlag < strlen(pszInputStr); iPosFlag ++) 
  187.         { 
  188.             if (pszInputStr[iPosFlag] >= 0)     // 不小于0则表示含有非中文字符 
  189.             { 
  190.                 printf("%s has non-Chinese character, please check!\n", pszInputStr); 
  191.                 return -2; 
  192.             } 
  193.         } 
  194.     } 
  195.     else if (iStrType == 2)    // 再判断非中文字符串 
  196.     { 
  197.         for (iPosFlag = 0; iPosFlag < strlen(pszInputStr); iPosFlag ++) 
  198.         { 
  199.             if (pszInputStr[iPosFlag] < 0)     // 小于0则表示含有中文字符 
  200.             { 
  201.                 printf("%s has Chinese character, please check!\n", pszInputStr); 
  202.                 return -3; 
  203.             } 
  204.         } 
  205.     } 
  206.     else 
  207.     { 
  208.         printf("Please input the right string type!\n"); 
  209.         return -4;  
  210.     } 
  211.  
  212.     return 0; 

五、程序测试

我们将编写好的程序“PalindromicString.c”上传到Linux机器,并使用“gcc -g -o PalindromicStringPalindromicString.c”命令对该程序进行编译,生成“PalindromicString”文件。下面对程序进行详细的测试。

1.输入中文字符串为“人上人”时,程序运行情况如下:

  1. Please input the string type(1:中文字符串,2:非中文字符串): 
  2. Please input the string: 
  3. 人上人 
  4. 人上人 is a palindromic string! 

2.输入中文字符串为“我是谁”时,程序运行情况如下:

  1. Please input the string type(1:中文字符串,2:非中文字符串): 
  2. Please input the string: 
  3. 我是谁 
  4. 我是谁 is not a palindromic string! 

3.输入非中文字符串为“level”时,程序运行情况如下:

  1. Please input the string type(1:中文字符串,2:非中文字符串): 
  2. Please input the string: 
  3. level 
  4. level is a palindromic string! 

4.输入非中文字符串为“good”时,程序运行情况如下:

  1. Please input the string type(1:中文字符串,2:非中文字符串): 
  2. Please input the string: 
  3. good 
  4. good is not a palindromic string! 

5.输入字符串为“你好good”时,程序运行情况如下:

  1. Please input the string type(1:中文字符串,2:非中文字符串): 
  2. Please input the string: 
  3. 你好good 
  4. 你好good has non-Chinese character, pleasecheck! 

6.输入字符串为“good好”时,程序运行情况如下:

  1. Please input the string type(1:中文字符串,2:非中文字符串): 
  2. Please input the string: 
  3. good好 
  4. good好 has Chinese character, pleasecheck! 

7.输入字符串类型非1或2时,程序运行情况如下:

  1. Please input the string type(1:中文字符串,2:非中文字符串): 
  2. Please input the string: 
  3. goog 
  4. Please input the right string type! 

可见,对于上面考虑到的几种特殊情况,程序均能做出正确的处理。

六、需求扩展

基于本文中的需求和程序,我们可考虑对需求进行以下扩展:

1.不限制输入的字符串中只能是中文串或者非中文串,可以是中文字符和非中文字符的混合串。

2.当输入的字符串中是非中文串时,要求该字符串的字符个数为偶数。即要求形如“goog”这样的字符串为回文串,而像“level” 这样的字符串不为回文串。

【本文是51CTO专栏作者周兆熊的原创文章,作者微信公众号:周氏逻辑(logiczhou)】

戳这里,看该作者更多好文

责任编辑:赵宁宁 来源: 51CTO专栏
相关推荐

2016-12-30 13:32:24

字符串算法代码

2016-12-30 13:16:51

字符串算法代码

2016-12-29 17:07:59

字符算法代码

2016-12-29 15:58:00

字符串子串算法

2016-12-30 13:37:50

字符串算法代码

2016-12-29 16:25:32

字符串算法代码

2023-02-26 22:33:32

字符串排列算法

2009-08-11 10:26:49

C#算法C#字符串反转

2013-05-06 10:54:08

字符串字符串匹配KMP算法

2023-12-15 10:27:01

暴力匹配算法Python字符串

2021-11-12 09:44:03

字符串算法复杂度

2021-09-03 09:41:36

字符串时间复杂度

2023-04-11 08:54:57

字符串匹配算法

2013-05-06 10:49:21

Boyer-Moore算法字符串匹配

2021-09-10 08:31:54

翻转字符串单词

2023-08-29 15:32:57

深度学习人工智能

2024-07-03 11:23:14

2009-09-02 15:53:27

C#判断字符串应用

2018-07-27 08:39:44

负载均衡算法实现

2010-11-26 09:51:54

MySQL字符串
点赞
收藏

51CTO技术栈公众号