需找字串中重複的最長子串
阿新 • • 發佈:2019-02-17
注意此處說的是重複的最長子串,只要出現重複就好,沒說重複的次數。
下面給出的程式碼是程式設計珠璣中給出的一種實現。
他是通過後綴陣列的方式實現的。
#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*
}