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

Posted 周兆熊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符串处理算法字符串包含的算法设计及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 < iInputStrLen; iStrPosFlag ++)
    {
        iRepeatFlag = 0;
        
        // 判断正要获取的字符是否已经存在了
        memset(szCharBuf, 0x00, sizeof(szCharBuf));
        memcpy(szCharBuf, szInputStr+iStrPosFlag, 1);

        // 若与之前已经加入的字符重复, 则忽略
        for (iLoopFlag = 0; iLoopFlag < iCharCount; iLoopFlag ++)
        {
            if (iProcessFlag == 1)    // 处理长字符串
            {
                if (0 == strncmp(gtLongerStrInfo.szStrCharArray[iLoopFlag], szCharBuf, 1))
                {
                    iRepeatFlag = 1;  // 有重复的, 直接忽略
                    break;
                }
            }
            else                     // 处理短字符串
            {
                if (0 == strncmp(gtShorterStrInfo.szStrCharArray[iLoopFlag], szCharBuf, 1))
                {
                    iRepeatFlag = 1;  // 有重复的, 直接忽略
                    break;
                }
            }
        }

        if (1 == iRepeatFlag)
        {
            continue;
        }

        if (iProcessFlag == 1)    // 处理长字符串
        {
            strncpy(gtLongerStrInfo.szStrCharArray[iCharCount], szCharBuf, 1);
        }
        else                      // 处理短字符串
        {
            strncpy(gtShorterStrInfo.szStrCharArray[iCharCount], szCharBuf, 1);
        }

        iCharCount = iCharCount + 1;
    }

    if (iProcessFlag == 1)    // 处理长字符串
    {
        gtLongerStrInfo.iStrCharCount = iCharCount;
    }
    else                      // 处理短字符串
    {
        gtShorterStrInfo.iStrCharCount = iCharCount;
    }

    return;
}


/**********************************************************************
* 功能描述: 判断长字符串是否包含了短字符串
* 输入参数: 无
* 输出参数: 无
* 返 回 值: 1-包含了 0-没有包含
* 其它说明: 无
* 修改日期          版本号         修改人           修改内容
* ---------------------------------------------------------------
* 20160216          V1.0       Zhou Zhaoxiong        创建
***********************************************************************/
INT32 JudgeIfContainsStr()
{
    UINT32 iLongerLoopFlag    = 0;
    UINT32 iShorterLoopFlag   = 0;
    UINT32 iCharIdenticalFlag = 0;

    // 判断较短的字符串中的字符是否全部都在较长的字符串中的字符中
    for (iShorterLoopFlag = 0; iShorterLoopFlag < gtShorterStrInfo.iStrCharCount; iShorterLoopFlag ++)
    {
        iCharIdenticalFlag = 0;
        for (iLongerLoopFlag = 0; iLongerLoopFlag < gtLongerStrInfo.iStrCharCount; iLongerLoopFlag ++)
        {
            if (strcmp(gtShorterStrInfo.szStrCharArray[iShorterLoopFlag], gtLongerStrInfo.szStrCharArray[iLongerLoopFlag]) == 0)
            {
                iCharIdenticalFlag = 1;    // 字符相同
                break;
            }
        }

        if (iCharIdenticalFlag == 0)     // 表示两个字符串中有不相同的字符
        {
            return 0;
        }
    }

    return 1;
}


    
   

以上是关于字符串处理算法字符串包含的算法设计及C代码实现的主要内容,如果未能解决你的问题,请参考以下文章

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

字符串处理算法删除特定的字符的算法设计及C代码实现

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

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

字符串处理算法将输入字符串中的各个单词反序的算法设计及C代码实现

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