看了一些網上的關於字尾樹的文章,發現大多是c/c++版的,參照幾個版本拼了乙個c#版的。
using system;
using system.collections.generic;
using system.linq;
using system.text;
namespace test_file
const int maxn = 500005;
//using namespace std;
int r = new int[maxn];
int wa = new int[maxn];
int wb = new int[maxn];
int wv = new int[maxn];
int tmp = new int[maxn];
intsa = new int[maxn];
private bool cmp(int r, int a, int b, int l)
/// ///
///
///
/// 與r型別、長度相同的陣列
/// 為陣列r的長度
/// 陣列中的最大值加1
public void da(int r, int sa, int n, int m)
}int rank = new int [maxn];
private int height = new int[maxn];
public void calheight(int r,int sa,int n)
return;
}int belong = new int[maxn];
int visit_len = 5000;
private bool ok(int a,int n, int m ,int sa)
for (k=i-1;k<=j;k++)
ba[belong[sa[k]]]=true;
for (k=0;ba[k] && k/// 二分搜尋
///
/// 拼接後的字串長度
/// 拼接前的字串個數
/// 初始字串陣列
///
private int binarysearch(int n , int m,int arr)
if (ok(r, n, m, arr))
l = r;
return l;
}/// /// 獲取最長公共字首
///
/// 字串陣列
///
public string get_lcs(string str)
char_len++;
ss += (char)(0xfd9b + (mark++)); //字串之間用乙個沒有出現過的字元間隔。 (str1 * str2 * str 3 * .....* strn *) *為不同的符號
}int m = 0, n = ss.length;
int r = new int[ss.length + 1];
int saa = new int[ss.length + 1];
char chars = ss.tochararray();
for (int i = 0; i < chars.length; i++)
r[n] = 0;
da(r, saa, n + 1, m + 1);
calheight(r, saa, ss.length);
int resu = binarysearch(ss.length, mark,saa);
if(resu > 0)
return get_ndx(resu , n , str.length , chars,saa);
else
return "none";
}/// /// 返回最長公共字串
///
/// 最長字串長度
/// 拼接後的字串長度
/// 初始字串陣列中字串的個數
/// 拼接並轉換後的字元陣列
/// sa陣列,儲存的是「排第幾的是誰」
///
private string get_ndx(int len , int n , int m , char s,int sa)
{stringbuilder result = new stringbuilder();
bool visit = new bool[visit_len];
int count=0;
for(int i=1;i0)
{if(count>m/2)
{for(int j=0,index=sa[i];j
最長公共子串LCS
找兩個字串的最長公共子串,這個子串要求在原字串中是連續的。其實這又是乙個序貫決策問題,可以用動態規劃來求解。我們採用乙個二維矩陣來記錄中間的結果。這個二維矩陣怎麼構造呢?直接舉個例子吧 bab 和 caba 當然我們現在一眼就可以看出來最長公共子串是 ba 或 ab b a b c 0 0 0 a ...
最長公共子串(LCS)
找兩個字串的最長公共子串,這個子串要求在原字串中是連續的。其實這又是乙個序貫決策問題,可以用動態規劃來求解。我們採用乙個二維矩陣來記錄中間的結果。這個二維矩陣怎麼構造呢?直接舉個例子吧 bab 和 caba 當然我們現在一眼就可以看出來最長公共子串是 ba 或 ab b a b c 0 0 0 a ...
LCS求最長公共子串
問題描述 給兩個子串行a和b,求長度最長的公共子串行,如1,5,2,6,8,7和2,3,5,6,9,8,4的最長公共子串行為5,6,8另乙個解為2,6,8求出這樣的子串行最長是多少?狀態轉移方程 對a1,a2 ai和b1,b2,bj 當a i b j 時,d i,j d i 1,j 1 1 否則d ...