一个字符串的操作可以求子串并定位

本文介绍了一个简单的子串查找算法实现,该算法能够在一个主串中查找指定子串的所有出现位置,并统计出现次数。通过示例代码展示了如何使用此算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

            随便写的一个字符串的操作可以在一个子串中求出某一个子串的出现次数和出现的位置。

 

#include<iostream>
#include
<string>
using namespace std;

int  PartPostion(char src[], char partString[], int pos) 
                                                                                                 
//从某一个位置开始定位子串的函数
{
    
int i = pos;                                                                          //从pos位置开始
    int j = 0;
    
int length_src = strlen(src);
    
int lenght_partString = strlen(partString);
    
while(i < length_src && j < lenght_partString)
    
{
        
if(src[i] == partString[j])                                                //如果相等则继续
        {
            i
++;
            j
++;
        }

        
else                                                                                 //否则回溯
        {
            i 
= i - j + 1;
            j 
= 0;
        }

    }


    
if(j >= lenght_partString)                                                   //表示找到并返回
    {
        
return i - lenght_partString;
    }

    
else
        
return -1;
}



int main()
{
    
char srcString[] = "egabcrtabcvabc";                                //定义主串
    char partString[] = "abc";                                                     //定义子串

    
int firstPos = PartPostion(srcString, partString, 6);
    cout
<<"第一次出现的位置为:"<<endl;
    cout
<<firstPos<<endl;

    
int currentPos = 0;
    
int length_src = strlen(srcString);
    
int lenght_partString = strlen(partString);
    
int i = 0;                                                                                 //用于保存出现子串的次数
    int count[10];                                                                        //用于保存第i次出现子串的位置
    
    
while(currentPos <= length_src)                                     //如果当前位置小于主串的长度
    {
        currentPos 
= PartPostion(srcString, partString, currentPos);
        
if(currentPos < 0)                                                           //主串中不包含子串则跳出循环
        {
            
break;
        }

        
else                                                                                  //记录第i次出现子串的位置
        {
            count[i
++= currentPos;       
        }

        currentPos 
+= lenght_partString;                                //在主串中滑动子串个字符后继续比较
    }

    cout
<<"出现的次数为:"<<i<<endl;
    cout
<<"出现的位置分别是:"<<endl;
    
for(int k = 0; k < i; k++)                                                        //分别输出出现的位置
        cout<<count[k]<<" ";
    
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值