计算一个字符串中有重复且最长的子串

 问题核心就是取出所有的子串都进行比对一次,然后取有重复且最长的那一个即可,那么怎么取出所有的子串呢?

从第一个开始,分别取c、ce、cee、ceea、ceeab...

从第二个开始,分别取e、ee、eea、eeab、eeabc...

从第三个开始,分别取e、ea、eab、eabc、eabcd...

从第四个开始,分别取a、ab、abc、abcd、abcda...

演示从第四个开始过程如下,将从当前位置开始的所有子串都找下是否有重复的,然后取出当前开始位置有重复的最大的一个即可

 

 代码如下:如果有多个最长重复子串,可以将所有的最长重复子串取出

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

/*
 *计算一个字符串中的有重复的最大字串
 *ceeabcdabjcabceg
 *得出的有重复的最大子串为abc
 */


int main()
{
	string str = "ceeabcdabjcabc1234eg1234";
	//string str = "ceeabbabbajcabceg";
	vector<string> maxSubStrVect;
	int maxSubStrLength = 0;
	//控制从哪一个位置开始
	for (int startPos = 0; startPos < str.length(); startPos++)
	{
		//当前剩下的字符串
		string remainStr = str.substr(startPos + 1);
		//控制从开始比对位置开始的1个字符,2个字符,3个字符,4个字符...找寻是否有重复的字符串,并且保证取最大的重复的那一个
		for (int count = 1; count < str.length()-startPos; count++)
		{
			string compareStr = str.substr(startPos, count);
			if (remainStr.find(compareStr) != remainStr.npos)		//find函数如果找到了子串,那么返回子串位置,否则返回一个npos
			{
				//获取当前重复的子串和之前找到的重复子串中较长的一个
				if (compareStr.length() > maxSubStrLength)
				{
					maxSubStrVect.clear();
					maxSubStrVect.push_back(compareStr);
					maxSubStrLength = compareStr.length();
				}
				else if (compareStr.length() == maxSubStrLength)
				{
					maxSubStrVect.push_back(compareStr);
				}
			}
		}	
	}
	cout << "该字符串中重复且最大的子串为:" << endl;
	for (const string& val : maxSubStrVect)
	{
		cout << val << "\t";
	}
	getchar();
}

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值