【字符串处理算法】最长连续字符及其出现次数的算法设计及C代码实现

开发 开发工具 算法
今天主要讲讲最长连续字符及其出现次数的算法设计及C代码实现。

一、需求描述

输入一个字符串,编写程序找出这个字符串中的最长连续字符,并求出其连续出现的次数。

例如,“123444445”中的最长连续字符是4,其连续出现的次数为5;“abcddef”中的最长连续字符是d,其连续出现的次数为2;“ab”中的最长连续字符是a,其连续出现的次数为1。

代码

二、算法设计

我们可以采取逐个比较字符串中各个字符的办法来获取最长连续字符及其连续出现的次数。程序的总体流程如图1所示。

图1 程序的总体流程

三、特殊流程考虑

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

1.如果输入的字符串中含有空格,那么我们只处理空格之前的字符串。

2.输入的字符串中可以包含数字、字母及一些特殊的字符,但不能包含中文字符。

四、程序代码

  1. /********************************************************************** 
  2. * 版权所有 (C)2016, Zhou Zhaoxiong。 
  3. * 文件名称: LongestContinChars.c 
  4. * 文件标识: 无 
  5. * 内容摘要: 寻找一个字符串中最长连续字符及其个数 
  6. * 其它说明: 例如, "aabbbc"的最长连续字符为b, 个数为3 
  7. * 当前版本: V1.0 
  8. * 作    者: Zhou Zhaoxiong 
  9. * 完成日期: 20160316 
  10. **********************************************************************/ 
  11. #include <stdio.h> 
  12.  
  13. // 重新定义数据类型 
  14. typedef signed   char  INT8; 
  15. typedef          int   INT32; 
  16. typedef unsigned int   UINT32; 
  17.  
  18. // 函数声明 
  19. void GetLongestContinChars(INT8 *pszInputStr); 
  20.  
  21.  
  22. /********************************************************************** 
  23. * 功能描述: 主函数 
  24. * 输入参数: 无 
  25. * 输出参数: 无 
  26. * 返 回 值: 0-执行成功   其它-执行失败 
  27. * 其它说明: 无 
  28. * 修改日期        版本号     修改人            修改内容 
  29. * --------------------------------------------------------------------- 
  30. * 20160316        V1.0     Zhou Zhaoxiong        创建 
  31. ***********************************************************************/ 
  32. INT32 main() 
  33.     INT8   szInputStr[100] = {0}; 
  34.     UINT32 iPosFlag        = 0
  35.      
  36.     printf("Please input the string: \n"); 
  37.     scanf("%s", szInputStr); 
  38.     printf("InputStr=%s\n", szInputStr); 
  39.  
  40.     // 先判断是否有中文字符 
  41.     for (iPosFlag = 0; iPosFlag < strlen(szInputStr); iPosFlag ++) 
  42.     { 
  43.         if (szInputStr[iPosFlag] < 0)     // 小于0则表示含有中文字符 
  44.         { 
  45.             printf("%s has Chinese character, please check!\n", szInputStr); 
  46.             return -1; 
  47.         } 
  48.     } 
  49.  
  50.     // 再调用函数获取最长连续字符及其个数 
  51.     GetLongestContinChars(szInputStr); 
  52.  
  53.     return 0; 
  54.  
  55.  
  56. /********************************************************************** 
  57. * 功能描述: 获取连续出现次数最多的字符及其连续出现次数 
  58. * 输入参数: pszInputStr-输入字符串 
  59. * 输出参数: 无 
  60. * 返 回 值: 无 
  61. * 其它说明: 无 
  62. * 修改日期        版本号     修改人            修改内容 
  63. * --------------------------------------------------------------------- 
  64. * 20160316        V1.0     Zhou Zhaoxiong        创建 
  65. ***********************************************************************/ 
  66. void GetLongestContinChars(INT8 *pszInputStr) 
  67.     INT8   cCompareChar       = '\0'
  68.     INT8   cLongestContinChar = '\0'
  69.     UINT32 iMaxLen            = 1
  70.     UINT32 iCharCount         = 1
  71.     UINT32 iPosFlag           = 0
  72.      
  73.     if (pszInputStr == NULL) 
  74.     { 
  75.         return; 
  76.     } 
  77.  
  78.     cCompareChar       = pszInputStr[0];  // 从***个字符开始比较 
  79.     cLongestContinChar = pszInputStr[0]; 
  80.  
  81.     for (iPosFlag = 1; iPosFlag < strlen(pszInputStr); iPosFlag ++)  
  82.     { 
  83.         if (pszInputStr[iPosFlag] == cCompareChar)  
  84.         { 
  85.             iCharCount ++;     // 对相同字符计数加1 
  86.         }  
  87.         else  
  88.         { 
  89.             iCharCount   = 1;                       // 字符不同时计数变为1 
  90.             cCompareChar = pszInputStr[iPosFlag];   // 重新比较新字符 
  91.         } 
  92.          
  93.         if (iCharCount > iMaxLen)   // 获取连续出现次数最多的字符及其出现次数 
  94.         { 
  95.             iMaxLen            = iCharCount
  96.             cLongestContinChar = pszInputStr[iPosFlag]; 
  97.         } 
  98.     } 
  99.   
  100.     printf("连续出现次数最多的字符是: %c\n连续出现的次数是: %d\n", cLongestContinChar, iMaxLen); 

五、程序测试

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

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

  1. Please input the string: 
  2. ababbba 
  3. InputStr=ababbba 
  4. 连续出现次数最多的字符是: b 
  5. 连续出现的次数是: 3 

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

  1. Please input the string: 
  2. 123321 
  3. InputStr=123321 
  4. 连续出现次数最多的字符是: 3 
  5. 连续出现的次数是: 2 

3.输入字符串为“!@##$%”时,程序运行情况如下:

  1. Please input the string: 
  2. !@##$% 
  3. InputStr=!@##$% 
  4. 连续出现次数最多的字符是: # 
  5. 连续出现的次数是: 2 

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

  1. Please input the string: 
  2. abcdef 
  3. InputStr=abcdef 
  4. 连续出现次数最多的字符是: a 
  5. 连续出现的次数是: 1  

5.输入字符串为“我们123”时,程序运行情况如下:

  1. Please input the string: 
  2. 我们123 
  3. InputStr=我们123 
  4. 我们123 has Chinese character, please check! 

六、需求扩展

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

1.不区分字母的大小写,即如果输入的字符串为“AAAaaa”,那么程序输出最长连续字符为A或a,出现次数为6。

2.不限制字符串中不能出现中文字符,即如果输入的字符串为“窝窝头123”,那么程序输出最长连续字符为窝,出现次数为2。

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

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

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

2016-12-30 13:32:24

字符串算法代码

2016-12-29 15:58:00

字符串子串算法

2016-12-30 13:16:51

字符串算法代码

2016-12-29 17:14:41

回文串算法代码

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#字符串反转

2021-09-02 09:22:13

算法无重复字符

2013-05-06 10:54:08

字符串字符串匹配KMP算法

2023-12-15 10:27:01

暴力匹配算法Python字符串

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

翻转字符串单词

2021-11-19 09:00:24

LeetCode字符串算法

2010-11-26 09:51:54

MySQL字符串

2024-07-03 11:23:14

2011-04-11 17:08:16

阶乘算法C++

2021-12-21 11:39:01

数据结构算法同构字符串
点赞
收藏

51CTO技术栈公众号