C 版字尾樹 最長公共串 LCS

2021-06-09 11:17:16 字數 2327 閱讀 9515

看了一些網上的關於字尾樹的文章,發現大多是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 ...