【字符串處理算法】最長連續(xù)字符及其出現(xiàn)次數(shù)的算法設(shè)計及C代碼實現(xiàn)
一、需求描述
輸入一個字符串,編寫程序找出這個字符串中的最長連續(xù)字符,并求出其連續(xù)出現(xiàn)的次數(shù)。
例如,“123444445”中的最長連續(xù)字符是4,其連續(xù)出現(xiàn)的次數(shù)為5;“abcddef”中的最長連續(xù)字符是d,其連續(xù)出現(xiàn)的次數(shù)為2;“ab”中的最長連續(xù)字符是a,其連續(xù)出現(xiàn)的次數(shù)為1。
二、算法設(shè)計
我們可以采取逐個比較字符串中各個字符的辦法來獲取最長連續(xù)字符及其連續(xù)出現(xiàn)的次數(shù)。程序的總體流程如圖1所示。
圖1 程序的總體流程
三、特殊流程考慮
在編寫程序的過程中,我們要對輸入的字符串的長度及格式多做考慮,如:
1.如果輸入的字符串中含有空格,那么我們只處理空格之前的字符串。
2.輸入的字符串中可以包含數(shù)字、字母及一些特殊的字符,但不能包含中文字符。
四、程序代碼
- /**********************************************************************
- * 版權(quán)所有 (C)2016, Zhou Zhaoxiong。
- *
- * 文件名稱: LongestContinChars.c
- * 文件標識: 無
- * 內(nèi)容摘要: 尋找一個字符串中最長連續(xù)字符及其個數(shù)
- * 其它說明: 例如, "aabbbc"的最長連續(xù)字符為b, 個數(shù)為3
- * 當(dāng)前版本: V1.0
- * 作 者: Zhou Zhaoxiong
- * 完成日期: 20160316
- *
- **********************************************************************/
- #include <stdio.h>
- // 重新定義數(shù)據(jù)類型
- typedef signed char INT8;
- typedef int INT32;
- typedef unsigned int UINT32;
- // 函數(shù)聲明
- void GetLongestContinChars(INT8 *pszInputStr);
- /**********************************************************************
- * 功能描述: 主函數(shù)
- * 輸入?yún)?shù): 無
- * 輸出參數(shù): 無
- * 返 回 值: 0-執(zhí)行成功 其它-執(zhí)行失敗
- * 其它說明: 無
- * 修改日期 版本號 修改人 修改內(nèi)容
- * ---------------------------------------------------------------------
- * 20160316 V1.0 Zhou Zhaoxiong 創(chuàng)建
- ***********************************************************************/
- 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;
- }
- }
- // 再調(diào)用函數(shù)獲取最長連續(xù)字符及其個數(shù)
- GetLongestContinChars(szInputStr);
- return 0;
- }
- /**********************************************************************
- * 功能描述: 獲取連續(xù)出現(xiàn)次數(shù)最多的字符及其連續(xù)出現(xiàn)次數(shù)
- * 輸入?yún)?shù): pszInputStr-輸入字符串
- * 輸出參數(shù): 無
- * 返 回 值: 無
- * 其它說明: 無
- * 修改日期 版本號 修改人 修改內(nèi)容
- * ---------------------------------------------------------------------
- * 20160316 V1.0 Zhou Zhaoxiong 創(chuàng)建
- ***********************************************************************/
- 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 ++; // 對相同字符計數(shù)加1
- }
- else
- {
- iCharCount = 1; // 字符不同時計數(shù)變?yōu)?
- cCompareChar = pszInputStr[iPosFlag]; // 重新比較新字符
- }
- if (iCharCount > iMaxLen) // 獲取連續(xù)出現(xiàn)次數(shù)最多的字符及其出現(xiàn)次數(shù)
- {
- iMaxLen = iCharCount;
- cLongestContinChar = pszInputStr[iPosFlag];
- }
- }
- printf("連續(xù)出現(xiàn)次數(shù)最多的字符是: %c\n連續(xù)出現(xiàn)的次數(shù)是: %d\n", cLongestContinChar, iMaxLen);
- }
五、程序測試
我們將編寫好的程序“LongestContinChars.c”上傳到Linux機器,并使用“gcc -g -oLongestContinChars LongestContinChars.c”命令對該程序進行編譯,生成“LongestContinChars”文件。下面對程序進行詳細的測試。
1.輸入字符串為“ababbba”時,程序運行情況如下:
- Please input the string:
- ababbba
- InputStr=ababbba
- 連續(xù)出現(xiàn)次數(shù)最多的字符是: b
- 連續(xù)出現(xiàn)的次數(shù)是: 3
2.輸入字符串為“123321”時,程序運行情況如下:
- Please input the string:
- 123321
- InputStr=123321
- 連續(xù)出現(xiàn)次數(shù)最多的字符是: 3
- 連續(xù)出現(xiàn)的次數(shù)是: 2
3.輸入字符串為“!@##$%”時,程序運行情況如下:
- Please input the string:
- !@##$%
- InputStr=!@##$%
- 連續(xù)出現(xiàn)次數(shù)最多的字符是: #
- 連續(xù)出現(xiàn)的次數(shù)是: 2
4.輸入字符串為“abcdef”時,程序運行情況如下:
- Please input the string:
- abcdef
- InputStr=abcdef
- 連續(xù)出現(xiàn)次數(shù)最多的字符是: a
- 連續(xù)出現(xiàn)的次數(shù)是: 1
5.輸入字符串為“我們123”時,程序運行情況如下:
- Please input the string:
- 我們123
- InputStr=我們123
- 我們123 has Chinese character, please check!
六、需求擴展
基于本文中的需求和程序,我們可考慮對需求進行以下擴展:
1.不區(qū)分字母的大小寫,即如果輸入的字符串為“AAAaaa”,那么程序輸出最長連續(xù)字符為A或a,出現(xiàn)次數(shù)為6。
2.不限制字符串中不能出現(xiàn)中文字符,即如果輸入的字符串為“窩窩頭123”,那么程序輸出最長連續(xù)字符為窩,出現(xiàn)次數(shù)為2。
【本文是51CTO專欄作者周兆熊的原創(chuàng)文章,作者微信公眾號:周氏邏輯(logiczhou)】