using System;
using System.Collections;
namespace 数据结构_数组
{
class Program
{
public static Int32 MaxLen;
public static Int32 Jpos;
public static Int32 k = 0;
public static int[] LengthArray = new Int32[100];//存储没一斜行最多的连续1的个数
public static int[] PosArray = new Int32[100];//存储没一行最多的连续1的开始位置
public static Hashtable ht = new Hashtable();
//假设s1="gabadfgtab",s2="sgabacbadfgtbacst",则公共字符串为"badfgt"
static void Main(string[] args)
{
string s1 = "gabadfgtab";
string s2 = "sgabacbadfgtbacst";
string s3 = Getmaxsamestr(s1, s2);
Console.WriteLine(s3);
Console.ReadLine();
}
/**********************************************************
* Getmaxsamestr函数主要设计矩阵
* *******************************************************/
public static string Getmaxsamestr(string s1, string s2)//不妨设s1.Length<=s2.Length
{
int[,] mat = new Int32[s1.Length, s2.Length];
for (int i = 0; i < s1.Length; i++)
for (int j = 0; j < s2.Length; j++)
{
if (s1[i] == s2[j])
mat[i, j] = 1; //根据字符串的匹配填写矩阵
else mat[i, j] = 0;
}
diagmax(mat, s1.Length, s2.Length, MaxLen, Jpos);
ArrayProcess(LengthArray, PosArray, s1.Length + s2.Length - 1);
return s2.Substring(Jpos, MaxLen);
}
/**********************************************************
* diagscan函数主要是计算斜行的连续1的最大个数,及开始位置
* *******************************************************/
public static void diagscan(int[,] mat, int m, int n, int i, int j, int mLen, int Jpos)
{
int eq = 0, len = 0, sj = 0;//eq主要用来判断是不是第一个为“1”的元素
while (i < m && j < n)
{
if (mat[i, j] == 1)
{
len++;
if (eq == 0) //扫描每一个对角线上最长的连续1的个数
{
eq = 1;
sj = j;
}
}
else if (eq == 1)
//eq主要用来判断1是第一个1还是连续的1
//比如”111101“当遇到第一个1时eq置1,遇到第二个1时直接在len上
//加1即可,如果遇到0将最大值赋值给MaxLen,并把标注为ben设为0
{
if (len > MaxLen)
{
MaxLen = len;
Jpos = sj;
}
eq = 0; len = 0;
}
i++;
j++;
}
if (len > MaxLen)
{
MaxLen = len;
Jpos = sj;
}
LengthArray[k] = MaxLen;
PosArray[k] = Jpos;//将最大值及位置放入数组中,以便比较那个斜行的值最大
k++;
MaxLen = 0;
Jpos = 0;
}
/*************************************************
* diagmax 循环扫描每一斜行
* **********************************************/
public static void diagmax(int[,] mat, int m, int n, int MaxLen, int Jpos)
{
int i, j;
int istart = 0;
for (int k = 1 - n; k <= m - 1; k++)
{
i = istart; j = i - k;
diagscan(mat, m, n, i, j, MaxLen, Jpos);
istart += (k >= 0) ? 1 : 0;
//ht.Add(MaxLen, Jpos);
}
}
public static void ArrayProcess(int[] a, int[] b, int n)//n为数组长度,a为长度数组
{
MaxLen = a[0]; Jpos = 0;
for (int i = 0; i < n; i++)
{
if (MaxLen < a[i])
{
MaxLen = a[i];
Jpos = b[i];
}
}
}
}
}
花了很长时间才调通。。。
算法:用数组求两个字符串最长的公共子串
最新推荐文章于 2024-09-20 10:50:16 发布