兩個字符串的最長公共子串-後綴數組

求解兩個子串的最長公共子串一般常用的是動態規劃算法,但是用後綴數組來處理這一類問題會非常簡便,在很多刷題系統中基本都有最長公共子串的處理,所以這一類問題是比較重要的。

c++版本的後綴數組處理最長公共子串問題。

#include <iostream>
#include <string>
using namespace std;
#define MAX 1000
int ranked[MAX]={};
int sa[MAX] ={};
int height[MAX] = {};
int main(){
	string iQueryMaxCommString(string& str1, string& str2);
	string stringA;
	string stringB;
	cin >> stringA;
	cin >> stringB;
	cout << iQueryMaxCommString(stringA,stringB)<< endl;
	return 0;
}
void sbubble(string* str,int len){
	for (int i = 0;i < len - 1;i++)
		for (int j = 0; j < len - i - 1;j++)
			if (str[j] > str[j+1]){
				string temp = str[j];
				str[j] = str[j+1];
				str[j+1] = temp;
			}
}
int comstr(const string& a,const string& b){
	int count = 0;
	int len1 = a.length();       
	int len2 = b.length();
	for (int i = 0,j = 0;i < len1&&j < len2;i++,j++)
		if (a[i] == b[j])
			count++;
		else break;
	return count;
}
void claheight(string* str,int n){
	for (int i = 0,j = 1;i < n-1&&j < n;j++,i++)
		height[i] = comstr(str[i],str[j]);
}
 string iQueryMaxCommString(string& str1, string& str2){
	 int lenstr2 = str2.length();
	 int lenstr1 = str1.length();
	string str=str1;
	str = str+'$';
	str = str + str2;
	int len = str.length();
	string* backstr = new string[len];
	for (int i = 0; i < len;i++)
		for (int j = i; j < len;j++)
			backstr[i]+=str[j];
	sbubble(backstr,len);
	for (int i = 0; i < len;i++){
		int size = backstr[i].length();
		ranked[len - size] = i;
		sa[i] = len - size;
	}
	claheight(backstr,len);
	int max = height[0],pos;
	for (int i = 0,j = 1;i < len-1&&j < len;i++,j++)
		if ((backstr[i].length()>lenstr2+1&&backstr[j].length() <= lenstr2)||
			(backstr[j].length()>lenstr2+1&&backstr[i].length() <= lenstr2))
			if (max < height[i]){
				max = height[i];
				pos = i;
			}	
	for (int i = 0; i < len;i++)
		if (max == height[i]){
			pos = i;
			break;
		}
	string obstr;
	for (int i = 0; i < max;i++)
		obstr+=backstr[pos][i];
	delete[] backstr;	
		return obstr;
}


發佈了27 篇原創文章 · 獲贊 90 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章