字符串中重复出现的最长字串-后缀树思想

本文介绍了一种寻找字符串中最长重复子串的算法实现。通过排序后缀并比较相邻后缀来找出最长的公共前缀作为最长重复子串。代码使用C++编写,并附带了一个示例。

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

/*
字符串中重复出现的最长字串MaxlenRepeatSubString.cpp

shanghai zilaishui laizi haishanghai
output:shanghai

@author arhaiyun
date:2013/09/23
*/

#include "stdafx.h"
#include<iostream>
#include<string>
#include <algorithm>

using namespace std;

int strPreCommonLen(string str1,string str2)//求两个字符串最长公共前缀长度
{
    int len = (str1.length() > str2.length()) ? str2.length() : str1.length();
    int i=0;
	
    while(i < len && str1[i]==str2[i])
         i++;
    return i;
}

string MaxlenRepeatSubString(string str,string &key)//求字符串str的最长重复字串,key是用来存放前缀的
{
    int len = str.length();
    string *sub= new string[len];//定义一个字符串数据存放后缀字符串
    for(int i=0;i<len;i++)
    {
		sub[i] = str.substr(i,len-1);
    }
    std::sort(sub,sub+len);//对后缀字符串进行排序
    int max = 1;
    for(int i = 1;i < len;i++)
    {
		int count = strPreCommonLen(sub[i], sub[i-1]);//计算相邻的字符串的公共前缀长度
		if(max < count)//如果当前长度大于最大长度,那么更新max和key
		{
			key = sub[i].substr(0,count);
			max = count;
		}
    }
	
	return key;
}
int main()
{
    string str = "shanghai zilaishui laizi haishanghai";
    string key = "ab";
    MaxlenRepeatSubString(str,key);
    cout<<key<<endl;

	system("pause");
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值