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

一、需求描述

给定一个长字符串和一个短字符串,编写程序判断短字符串中的所有字符是否都在长字符串中。如果是,则长字符串包含短字符串;反之,不包含。

为了尽量包含大多数情况,字符串中可以包含大小写英文字母、数字和各种标点符号,并且区分大小写字母。

下面举几个例子予以说明:

1.如果长字符串是“ABCDE”,短字符串是“ADC”,那么短字符串中的所有字符都在长字符串中,即长字符串包含了短字符串。

2.如果长字符串是“ABCDE”,短字符串是“ADCF”,那么短字符串中不是所有字符都在长字符串中,即长字符串不包含了短字符串。

3.如果长字符串是“ABCDE”,短字符串是“AAB”,那么短字符串中的所有字符都在长字符串中,即长字符串包含了短字符串。

 

二、算法设计

我们都知道,就像人体是由一个个的细胞组成一样,一个字符串是由一个个的字符组成。如果组成某个字符串的所有字符都在另一个字符串中,那么这个字符串就被另一个字符串包含。

因此,我们可以考虑先将两个字符串中的所有字符都找出来,再判断较短的字符串中的所有字符是否都出现在了较长的字符串中。如果是,那么两个字符串是包含与被包含的关系;如果不是,那么两个字符串则“形同陌路”。

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

图1 程序的总体流程

 

三、特殊流程考虑

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

1.如果输入失误,导致短字符串的长度大于了长字符串,那么程序直接返回,不进行后续处理。

2.不允许在输入字符串的中间出现空格,如果出现了,只能把空格前面的内容作为输入的字符串。

3.输入字符串可以包含字母(区分大小写)、数字、标点符号等字符。

4.为了方便程序处理,设定较长的字符串最长为500个字节,较短的字符串最长为100个字节。

 

四、程序代码

 

/**********************************************************************
* 版权所有 (C)2016, Zhou Zhaoxiong。
*
* 文件名称: StringContains.c
* 文件标识: 无
* 内容摘要: 测试一个字符串是否是另一个字符串的子串
* 其它说明: 例如, "ABC"是"ABCD"的子串
* 当前版本: V1.0
* 作    者: Zhou Zhaoxiong
* 完成日期: 20160216
*
**********************************************************************/
#include
#include 

// 重新定义数据类型
typedef signed   char       INT8;
typedef unsigned short int  UINT16;
typedef          int        INT32;
typedef unsigned int        UINT32;

// 存放字符串中的字符和格式的结构体
typedef struct
{
    INT8   szStrCharArray[101][2];     // 字符串中不相同的字符的存放数组,最大支持100个
    INT32  iStrCharCount;              // 字符串中不相同的字符的个数
} StrInfo_T;

StrInfo_T gtLongerStrInfo  = {0};
StrInfo_T gtShorterStrInfo = {0};

// 函数声明
void GetStrChar(INT8 *pszInputStr, INT32 iProcessFlag);
INT32 JudgeIfContainsStr();

/**********************************************************************
* 功能描述: 主函数
* 输入参数: 无
* 输出参数: 无
* 返 回 值: 0-执行成功   其它-执行失败
* 其它说明: 无
* 修改日期        版本号       修改人          修改内容
* -----------------------------------------------------------------
* 20160216        V1.0     Zhou Zhaoxiong        创建
***********************************************************************/
INT32 main()
{
    INT8   szLongerStr[500]   = {0};
    INT8   szShorterStr[100]  = {0};

    UINT32 iContainFlag = 1;     // 包含标志, 1-包含, 0-不包含

    printf("Please input the longer string: \n");
    scanf("%s", szLongerStr);
    printf("LongerStr=%s\n", szLongerStr);

    printf("Please input the shorter string: \n");
    scanf("%s", szShorterStr);
    printf("ShorterStr=%s\n", szShorterStr);

    // 如果ShorterStr的长度大于LongerStr, 则直接返回
    if (strlen(szShorterStr) > strlen(szLongerStr))
    {
        printf("%s is longer than %s, please check!\n", szShorterStr, szLongerStr);
        return -1;
    }

    // 获取较长的字符串中的不同的字符
    GetStrChar(szLongerStr, 1);

    // 获取较短的字符串中的不同的字符
    GetStrChar(szShorterStr, 2);

    iContainFlag = JudgeIfContainsStr();
    if (iContainFlag == 0)
    {
        printf("%s doesn't contain %s!\n", szLongerStr, szShorterStr);
    }
    else
    {
        printf("%s contains %s!\n", szLongerStr, szShorterStr);
    }

    return 0;
}

/**********************************************************************
* 功能描述: 获取字符串中不相同的字符及其个数
* 输入参数: pszInputStr-输入字符串
             iProcessFlag-处理标志(1:处理长字符串, 2:处理短字符串)
* 输出参数: 无
* 返 回 值: 无
* 其它说明: 无
* 修改日期          版本号         修改人           修改内容
* ---------------------------------------------------------------
* 20160216          V1.0       Zhou Zhaoxiong        创建
***********************************************************************/
void GetStrChar(INT8 *pszInputStr, INT32 iProcessFlag)
{
    INT32  iCharCount      = 0;                // 字符个数
    INT8   szInputStr[501] = {0};
    INT8   szCharBuf[2]    = {0};              // 存放单个字符的缓存
    INT32  iRepeatFlag     = 0;
    UINT32 iStrPosFlag     = 0;
    UINT32 iLoopFlag       = 0;
    UINT32 iInputStrLen    = 0;

    if (pszInputStr == NULL)
    {
        return;
    }

    iInputStrLen = strlen(pszInputStr);
    if (iInputStrLen >= 500)  // 最大支持100个字母
    {
        return;
    }

    memcpy(szInputStr, pszInputStr, iInputStrLen);

    iCharCount = 0;

    for (iStrPosFlag = 0; iStrPosFlag 

 

五、程序测试

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

1.输入较长字符串为“ABCDF”、较短字符串为“AF”时,程序运行情况如下:

Please input the longer string:

ABCDF

LongerStr=ABCDF

Please input the shorter string:

AF

ShorterStr=AF

ABCDF contains AF!

 

2.输入较长字符串为“AB”、较短字符串为“ABC”时,程序运行情况如下:

Please input the longer string:

AB

LongerStr=AB

Please input the shorter string:

ABC

ShorterStr=ABC

ABC is longer than AB, please check!

 

3.输入较长字符串为“awe”、较短字符串为“rf”时,程序运行情况如下:

Please input the longer string:

awe

LongerStr=awe

Please input the shorter string:

rf

ShorterStr=rf

awe doesn't contain rf!

 

4.输入较长字符串为“`11245”、较短字符串为“45”时,程序运行情况如下:

Please input the longer string:

`11245

LongerStr=`11245

Please input the shorter string:

45

ShorterStr=45

`11245 contains 45!

 

5.输入较长字符串为“123”、较短字符串为“123 45”时,程序运行情况如下:

Please input the longer string:

123

LongerStr=123

Please input the shorter string:

123 45

ShorterStr=123

123 contains 123!

 

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

 

六、需求扩展

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

1.限制输入的字符串中只能包含字母,如果包含了其它字符,则直接退出而不进行处理。

2.如果较短的字符串中的所有字符虽然都在较长的字符串中,但某个字符在较短的字符串中出现的次数大于了在较长的字符串中出现的次数,那么就认为较长的字符串不包含较短的字符串。

 

时间: 2024-08-03 21:16:44

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

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

一.需求描述 输入一个字符串,编写程序判断这个字符串是否是回文串. 为了便于说明,设定输入的字符串分为中文字符串和非中文字符串两种.其中,中文字符串中仅包含中文字符,非中文字符串中不包含中文字符. 所谓回文串,是指正读和反读都一样的字符串.下面举几个例子予以说明: 1."level"是一个非中文字符的回文串,因为正读和反读都是"level". 2."Good"不是一个非中文字符的回文串. 3."我爱我"是一个中文字符的回文串,

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

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

字符串的模式匹配详解--BF算法与KMP算法_C 语言

一.BF算法    BF算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串P的第一个字符进行匹配,若相等,则继续比较S的第二个字符和P的第二个字符:若不相等,则比较S的第二个字符和P的第一个字符,依次比较下去,直到得出最后的匹配结果.    举例说明: S: ababcababa P: ababa BF算法匹配的步骤如下 i=0 i=1 i=2 i=3 i=4 第一趟:ababcababa 第二趟:ababcababa 第三趟:ababcababa 第四趟:ababcab

[算法]字符串消除问题的数学证明

问题: 给定一个字符串,仅由A.B.C3个字母组成.当出现连续两个不同的字母时,你可以用另外一个字母替换它,如有AB或BA连续出现,你把它们替换为字母C:有AC或CA连续出现时,你可以把它们替换为字母B:有BC或CB连续出现时,你可以把它们替换为字母A.可以不断反复按照这个规则进行替换,目标是使得最终结果所得到的字符串尽可能短,求最终结果的最短长度. 输入:字符串.长度不超过200,仅由ABC3个字母组成. 输出:按照上述规则不断消除替换,所得到的字符串最短的长度.   例如: 输入CAB,输出

字符串搜索-Boyer-Moore算法 《数据结构与算法c++版》Adam Drozdek

问题描述 Boyer-Moore算法 <数据结构与算法c++版>Adam Drozdek 通常BM算法采用的是坏字符和好后缀算法(eg.,BM算法),我学习的<数据结构与算法c++版>Adam Drozdek版教材上使用了 全后缀和部分后缀规则,这种方法在网络上基本查不到. 作者解释原理时,一个关键的函数只是给出公式,基本上没有解释,如下: 请问怎么理解这个公式,尤其是公式中的s代表什么意思? 原书我已经在云盘共享,关于BM算法书上在P687面.希望能帮忙解决.

vhdl-请教互相关算法测时间延迟的fpga设计该怎么做?菜鸟一枚

问题描述 请教互相关算法测时间延迟的fpga设计该怎么做?菜鸟一枚 要在quartusii上用VHDL做基于互相关算法的时延估计,fpga刚接触,不知道该怎么设计.求代码.仿真图参考啊

算法难题设计出java代码或者伪代码,大牛请进。

问题描述 算法难题设计出java代码或者伪代码,大牛请进. 把 1 2 3 4 5 6 7 8 9 放入三个数组里面 数组可以是空的.. 数组里面的数 是有序的 比如 {1 2 3} { 4 5 6 } { 7 8 9 }:{356789},{124},{}能穷举吗.打印出来 解决方案 {123456789},{},{} 可以么,如果是可以的话,那么是非常简单的 解决方案二: 我是一个刚刚学习编程半年的小白,有点思路,可能不准确,抛砖引玉.我觉得这个题的实质,是对1 2 3 4 5 6 7 8

Base64进行解码的时候输入的不是有效的 Base-64 字符串,因为它包含非 Base-64 字符、两个以上的填充字符,或者填充字符间包含非法字符

问题描述 输入的不是有效的Base-64字符串,因为它包含非Base-64字符.两个以上的填充字符,或者填充字符间包含非法字符 解决方案 解决方案二:那就说明不是base64编码,错误提示这么明显,有什么问题吗?

JS不用正则验证输入的字符串是否为空(包含空格)的实现代码_基础知识

在项目中需要验证输入的字符串是否为空,包括空格,不太喜欢使用正则,所以就想到了js的indexOf函数,indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置,如果要检索的字符串值没有出现,则该方法返回 -1. 语法:stringObject.indexOf(searchvalue,fromindex),searchvalue必需,fromindex:可选参数,在字符串中开始检索的位置.它的合法取值是 0 到 stringObject.length - 1.如省略该参数,则将从

PHP 实现字符串翻转(包含中文汉字)的实现代码

包含汉字字符串乱码 PHP面试题,题目很短,也很常见,但更容易出错,题目如下 如何实现字符串翻转? 第一反应,当然是strrev函数啦,这么容易的题目还放在面试里考,真不嫌麻烦啊?但是看了网上的答案后,发现自己错了~~~ strrev函数对英文很好用,直接可以实现字符串翻转,但是面对中文呢?肯定都是乱码,对于这样的问题有很多,比如strstr,substr等函数都是这样的.还好PHP提供了mb_类的函数实现不同编码.不同语言之间的相互转换等操作.下面是我写的PHP字符串翻转函数(mb_类的函数需