本串最长重复子串
思路:将S中以每两个字符为开头的子串进行比较。
Void Get_LRepSub(StringType S)
{
MaxLen = 0; Index1 = 0; Index2 = 0;
For(i=1;i<=S.length;i++){ //此处,i为两字符的距离
For(k=0,j=1;j<=S.length-i;j++){
If(S[j] == S[j+i]) k++;
Else k = 0;
If(k > MaxLen){
MaxLen = k; Index1 = j; Index2 = j+i;
}
}
}
} //如要求重复子串不重叠,则在内层For循环中添加条件k<=i
时间复杂度为 O(S.length ^ 2)
最长公共子串
思路:借助本串最长重复子串的思路,将两字符串开做一个字符串,查找其本串最长重复子串,如果两重复的子串分别在原来的两个字符串中,则查找成功。
Void Get_LPubSub(StringType S, StringType T)
{
If(S.length > T.length)
A = S; B = T;
Else
A = T; B = S; //A和B形如|B|A|
MaxLen = 0; Index1 = 0; Index2 = 0;
For(i=1;i<=A.length+B.length;i++){
//j的取值必然在B的长度范围内,即j<B.length;j+i的取值必然在A的范围内,即j+i>B.length,即j>B.length-i
For(k=0,j=B.length-i+1;j<B.length;j++){
If(B[j] == A[j+i-B.length]) k++;
Else k = 0;
If(k > MaxLen){
MaxLen = k; Index1 = j; Index2 = j+i-B.length;
}
}
}
}
时间复杂度为O(S.length*T.length)