char * suff[100];
int pstrcmp(const void p, const void *q)
{
return strcmp((char**)p,*(char**)q);
}
int comlen_suff(char * p, char * q)
{
int len = 0;
while(*p && *q && *p++ == *q++)
{
++len;
if(*p == '#' || *q == '#')
{
return len;
}
}
return 0;
}
void LCS_suffix(char * X, int xlen, char * Y, int ylen)
{
int suf_index = maxlen = maxindex = 0;
int len_suff = xlen + ylen + 1;
char * arr = new char [len_suff + 1]; /* 將X和Y連接到一起 */
strcpy(arr,X);
arr[xlen] = '#';
strcpy(arr + xlen + 1, Y);
for(int i = 0; i < len_suff; ++i) /* 初始化後綴數組 */
{
suff[i] = & arr[i];
}
qsort(suff, len_suff, sizeof(char *), pstrcmp);
for(int i = 0; i < len_suff-1; ++i)
{
int len = comlen_suff(suff[i],suff[i+1]);
if(len > maxlen)
{
maxlen = len;
suf_index = i;
}
}
outputLCS(suff[suf_index]);
}
後綴數組是處理字符串的有力工具。後綴數組是後綴樹的一個非常精巧的替代品,它比後綴樹容易編程實現,能夠實現後綴樹的很多功能而時間復雜度也並不遜色,而且它比後綴樹所占用的內存空間小很多。
子串:字符串S的子串r[i..j],i<=j,表示r串中從i到j這一段,也就是順次排列r[i],r[i+1],...,r[j]形成的字符串。
後綴:後綴是指從某個位置i開始到整個串末尾結束的一個特殊子串。字符串 s 的從第i個字符開始的後綴表示為Suffix(i), 也就是Suffix(i)=r[i..len(s)]。
大小比較:關於字符串的大小比較,是指通常所說的“字典順序”比較,也就是對於兩個字符串u、v,令i 從1 開始順次比較u[i]和v[i],如果u[i]=v[i]則令i加1,否則若u[i]v[i]則認為u>v(也就是vlen(u)或者i>len(v)仍比較不出結果,那麼,若len(u)len(v)則u>v。
從字符串的大小比較的定義來看,S的兩個開頭位置不同的後綴u和v進行比較的結果不可能是相等,因為u=v的必要條件len(u)=len(v)在這裡不可能滿足。
後綴數組:後綴數組SA是一個一維數組,它保存1..n的某個排列SA[1],SA[2],……,SA[n],並且保證Suffix(SA[i])<Suffix(SA[i+1]),1<=i<n。也就是將S的n個後綴從小到大進行排序之後把排好序的後綴的開頭位置順次放入SA中。
1 後綴數組求最長公共子串(LCS)