一、需求描述
输入一个字符串,编写程序找出这个字符串中的最长连续字符,并求出其连续出现的次数。
例如,“123444445”中的最长连续字符是4,其连续出现的次数为5;“abcddef”中的最长连续字符是d,其连续出现的次数为2;“ab”中的最长连续字符是a,其连续出现的次数为1。
二、算法设计
我们可以采取逐个比较字符串中各个字符的办法来获取最长连续字符及其连续出现的次数。程序的总体流程如图1所示。
图1 程序的总体流程
三、特殊流程考虑
在编写程序的过程中,我们要对输入的字符串的长度及格式多做考虑,如:
1.如果输入的字符串中含有空格,那么我们只处理空格之前的字符串。
2.输入的字符串中可以包含数字、字母及一些特殊的字符,但不能包含中文字符。
四、程序代码
- /**********************************************************************
- * 版权所有 (C)2016, Zhou Zhaoxiong。
- *
- * 文件名称: LongestContinChars.c
- * 文件标识: 无
- * 内容摘要: 寻找一个字符串中最长连续字符及其个数
- * 其它说明: 例如, "aabbbc"的最长连续字符为b, 个数为3
- * 当前版本: V1.0
- * 作 者: Zhou Zhaoxiong
- * 完成日期: 20160316
- *
- **********************************************************************/
- #include <stdio.h>
- // 重新定义数据类型
- typedef signed char INT8;
- typedef int INT32;
- typedef unsigned int UINT32;
- // 函数声明
- void GetLongestContinChars(INT8 *pszInputStr);
- /**********************************************************************
- * 功能描述: 主函数
- * 输入参数: 无
- * 输出参数: 无
- * 返 回 值: 0-执行成功 其它-执行失败
- * 其它说明: 无
- * 修改日期 版本号 修改人 修改内容
- * ---------------------------------------------------------------------
- * 20160316 V1.0 Zhou Zhaoxiong 创建
- ***********************************************************************/
- INT32 main()
- {
- INT8 szInputStr[100] = {0};
- UINT32 iPosFlag = 0;
- printf("Please input the string: \n");
- scanf("%s", szInputStr);
- printf("InputStr=%s\n", szInputStr);
- // 先判断是否有中文字符
- for (iPosFlag = 0; iPosFlag < strlen(szInputStr); iPosFlag ++)
- {
- if (szInputStr[iPosFlag] < 0) // 小于0则表示含有中文字符
- {
- printf("%s has Chinese character, please check!\n", szInputStr);
- return -1;
- }
- }
- // 再调用函数获取最长连续字符及其个数
- GetLongestContinChars(szInputStr);
- return 0;
- }
- /**********************************************************************
- * 功能描述: 获取连续出现次数最多的字符及其连续出现次数
- * 输入参数: pszInputStr-输入字符串
- * 输出参数: 无
- * 返 回 值: 无
- * 其它说明: 无
- * 修改日期 版本号 修改人 修改内容
- * ---------------------------------------------------------------------
- * 20160316 V1.0 Zhou Zhaoxiong 创建
- ***********************************************************************/
- void GetLongestContinChars(INT8 *pszInputStr)
- {
- INT8 cCompareChar = '\0';
- INT8 cLongestContinChar = '\0';
- UINT32 iMaxLen = 1;
- UINT32 iCharCount = 1;
- UINT32 iPosFlag = 0;
- if (pszInputStr == NULL)
- {
- return;
- }
- cCompareChar = pszInputStr[0]; // 从***个字符开始比较
- cLongestContinChar = pszInputStr[0];
- for (iPosFlag = 1; iPosFlag < strlen(pszInputStr); iPosFlag ++)
- {
- if (pszInputStr[iPosFlag] == cCompareChar)
- {
- iCharCount ++; // 对相同字符计数加1
- }
- else
- {
- iCharCount = 1; // 字符不同时计数变为1
- cCompareChar = pszInputStr[iPosFlag]; // 重新比较新字符
- }
- if (iCharCount > iMaxLen) // 获取连续出现次数最多的字符及其出现次数
- {
- iMaxLen = iCharCount;
- cLongestContinChar = pszInputStr[iPosFlag];
- }
- }
- printf("连续出现次数最多的字符是: %c\n连续出现的次数是: %d\n", cLongestContinChar, iMaxLen);
- }
五、程序测试
我们将编写好的程序“LongestContinChars.c”上传到Linux机器,并使用“gcc -g -oLongestContinChars LongestContinChars.c”命令对该程序进行编译,生成“LongestContinChars”文件。下面对程序进行详细的测试。
1.输入字符串为“ababbba”时,程序运行情况如下:
- Please input the string:
- ababbba
- InputStr=ababbba
- 连续出现次数最多的字符是: b
- 连续出现的次数是: 3
2.输入字符串为“123321”时,程序运行情况如下:
- Please input the string:
- 123321
- InputStr=123321
- 连续出现次数最多的字符是: 3
- 连续出现的次数是: 2
3.输入字符串为“!@##$%”时,程序运行情况如下:
- Please input the string:
- !@##$%
- InputStr=!@##$%
- 连续出现次数最多的字符是: #
- 连续出现的次数是: 2
4.输入字符串为“abcdef”时,程序运行情况如下:
- Please input the string:
- abcdef
- InputStr=abcdef
- 连续出现次数最多的字符是: a
- 连续出现的次数是: 1
5.输入字符串为“我们123”时,程序运行情况如下:
- Please input the string:
- 我们123
- InputStr=我们123
- 我们123 has Chinese character, please check!
六、需求扩展
基于本文中的需求和程序,我们可考虑对需求进行以下扩展:
1.不区分字母的大小写,即如果输入的字符串为“AAAaaa”,那么程序输出最长连续字符为A或a,出现次数为6。
2.不限制字符串中不能出现中文字符,即如果输入的字符串为“窝窝头123”,那么程序输出最长连续字符为窝,出现次数为2。
【本文是51CTO专栏作者周兆熊的原创文章,作者微信公众号:周氏逻辑(logiczhou)】