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

一、需求描述

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

例如,“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 

// 重新定义数据类型
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  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。

 

时间: 2024-10-22 17:06:36

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

找出所有最长连续重复子串及其个数

问题描述: 找出字符串中所以最长连续重复子串及其个数 比如: 输入:123234,最大连续重复字符串为23,个数为2 输入:5555,最大连续重复字符串为555,个数为2 输入:aaabbb 最大连续重复字符串为aa,个数为2:和bb,个数为2 必须存在重复的字符串才算,只出现一次的不算.可能存在多个相同长度的不同字符串,比如aaabbb. 解题思路 与[求一个字符串中连续出现次数最多的子串]的区别体现在两个方面:一是要找最长子串(重复次数大于等于2即可):二是要考虑子串是有重叠的重复,如eee

【字符串处理算法】获取最长公共子串的算法设计及C代码实现

一.需求描述 输入两个字符串,编写程序获取这两个字符串的第一个最长公共子串. 例如,输入的字符串为"abcdef"和"fecdba",那么这两个字符串的第一个最长公共子串为"cd".   二.算法设计 我们可以首先寻找两个字符串中的第一个相等的字符,然后分别向后移动来比较对应位置的字符是否相等. 即如果字符串1为"1234abcd",字符串2为"abd",那么首先发现字符串1中的第五个字符"a&q

返回给定字符串中最长连续数字串

/* 不用任何库函数,系统函数, 完成函数 int maxContinuNum(const char* inputstr,char *outputstr); 返回给定字符串中最长连续数字串,让outputstr指向该串,然后值是其长度. 例如sss12345ss1245sfdf123456789返回,9,outputstr指向123456789. */ #include <iostream> using namespace std; int maxContunuNum(const char*

把字符串中的任意连续字符换成一个对应字符

<?php //1,把字符串中的任意空格换成一个 $str1 = 'A B C '; echo '<xmp>'; echo '1:'; echo preg_replace ("/\s+/", ' ', $str1); echo '</xmp>'; //2,把字符串中的任意连续字符 M 换成一个 M echo '2: '; $str1 = 'AMMMBMMMMCMM '; echo preg_replace ("/M+/", 'M', $

[算法] 定义一个函数,删除字符串中所有重复出现的字符。

例如输入google,输出gole 思路: 利用一个hash table用来记录输入字符串中每次字符出现的次数,如果不是0,再复制,如果是1,则跳过.需要新开辟一个数组用来存储新的字符. char * DeleteRepeat(const char *string){ if(string == NULL) return '\0'; int *array = new int[256]; //initilize the array for(int i = 0; i<256; i++){ array[

【字符串处理算法】字符串包含的算法设计及C代码实现

一.需求描述 给定一个长字符串和一个短字符串,编写程序判断短字符串中的所有字符是否都在长字符串中.如果是,则长字符串包含短字符串:反之,不包含. 为了尽量包含大多数情况,字符串中可以包含大小写英文字母.数字和各种标点符号,并且区分大小写字母. 下面举几个例子予以说明: 1.如果长字符串是"ABCDE",短字符串是"ADC",那么短字符串中的所有字符都在长字符串中,即长字符串包含了短字符串. 2.如果长字符串是"ABCDE",短字符串是"

C++字符串完全指引之一:Win32 字符编码

引言 毫无疑问,我们都看到过像 TCHAR, std::string, BSTR 等各种各样的字符串类型,还有那些以 _tcs 开头的奇怪的宏.你也许正在盯着显示器发愁.本指引将总结引进各种字符类型的目的,展示一些简单的用法,并告诉您在必要时,如何实现各种字符串类型之间的转换. 在第一部分,我们将介绍3种字符编码类型.了解各种编码模式的工作方式是很重要的事情.即使你已经知道一个字符串是一个字符数组,你也应该阅读本部分.一旦你了解了这些,你将对各种字符串类型之间的关系有一个清楚地了解. 在第二部分

C#对很长的字符的操作

问题描述 C#对很长的字符的操作 我有这样一段文字问:我是某某,你好答:明白.问:你的个人简历?答:我叫张三,手机1388888888我只想要'问:'的东西,其它都不要,请问这样改怎么操作???求大神指教 解决方案 我想请问我说的这句话,后面的字符是什么?提问,总要将问题说清楚吧.你问题都不说清楚,别人怎么帮你. 解决方案二: 首先,你这些字符串是如何存贮的?如果是存贮在一个字符串中,可以采用下面的方法:字符串基本操作,先查找"问:",再查找回车换行符,中间的内容就是你想要的. 解决方

java-求字符串中相同最长的字串

问题描述 求字符串中相同最长的字串 用java程序写 题目:输入一行字母组成的字符串,找出其中出现的相同且 长度最长的字符串,输出它及其首字符的位置. 如yyabrdabjcabreg,则输出为abr,3.异常情况输出-1 解决方案 /** * 思路:"abdab" 拆分情况:1.ab abd abda abdab 2.bd bda bdab 3 da dab 4 ab 5 b * * @param str * @return */ public static String find(