1. 程式人生 > >需找字串中重複的最長子串

需找字串中重複的最長子串

注意此處說的是重複的最長子串,只要出現重複就好,沒說重複的次數。

下面給出的程式碼是程式設計珠璣中給出的一種實現。

他是通過後綴陣列的方式實現的。

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
using namespace std;
int comlen(char*p, char*q)//找出公共的最長子串
{
	int i = 0;
	if (p == NULL || q == NULL)
		return 0;
	while ( (*p++ == *q++))
		i++;
	return i;
}
int pstrcmp(const void*a, const void*b)
{
	return strcmp(*(char**)(a),*(char**)(b));
}
int main()
{
	char* s = "abcdabce";
	char* a[8];//指標字尾陣列
	for (int i = 0;; i++)
	{
		if (s[i] == 0)
			break;
		a[i] = &s[i];//指標字尾陣列賦值
	}
	qsort(a, 8, sizeof(char*), pstrcmp);
	int maxlen = 0,maxi=0;
	for (int i = 0; i < 7; i++)//找出相鄰的最大子串
				if (comlen(a[i], a[i + 1])>maxlen)
			{
			maxlen = comlen(a[i], a[i + 1]);
			maxi = i;
			}
	printf("%.*s\n", maxlen, a[maxi]);
	}

在這裡特別說明一下在書中沒有給出pstrcmp的實現,當時寫的程式時候出現的bug位子就是這裡。
int pstrcmp(const void*a, const void*b)
{
	return strcmp(*(char**)(a),*(char**)(b));//注意此處的char**而不是char*
}