求最长重复子串
如题,这个问题网上出现次数很多,我使用js写一下后缀数组方法求最长重复子串,一来加深印象,二来熟练一下js语法。
算法思路:
1.生成后缀数组
2.后缀数组按字母顺序排序,方便有重复子串的数组挨在一起
3.比较相邻数组,求最大前缀长度;记录所有结果中的最大前缀长度和数组
4.记录的数组取记录长度的前缀即结果
1 var str = "banana", 2 suffixArr = [], 3 len = str.length, 4 maxStrIndex = -1, 5 maxLen = 0,i,j; 6 7 for (i=0; i<len; i++){ //生成后缀数组 8 suffixArr[i] = str.substring(i,len); 9 /*suffixArr[i] = ""; //不使用substring 10 for(j=i;j<i+len;j++){ 11 suffixArr[i]+=str[j]; 12 }*/ 13 } 14 suffixArr.sort(); //按字母排序 15 16 for (i=0; i<len-1; i++){ //比较相邻数组求最长子串 17 j=0; 18 while(suffixArr[i][j]==suffixArr[i+1][j]) 19 j++; 20 if(j>maxLen){ 21 maxStrIndex = i; 22 maxLen = j; 23 } 24 } 25 console.log(suffixArr[maxStrIndex].substring(0,maxLen)); //最长重复子串ana