(C#)最大公共子串
2016-08-29 18:35
253 查看
这道算法题目,见了好多遍了,也没时间好好整理一下。这次稍微看了一点。
首先题目意思是这样的:
两个字符串,求公共的连续子串的最大长度。
例如:s1: abcd s2:bcde 则最大公共子串长度是3
首先,让我们看一下暴力解决:
<span style="font-size:18px;"> static int common(String s1, String s2)
{
int maxcount = 0;
for (int i = 0; i < s1.Length; i++)
{
for (int j = 0; j < s2.Length; j++)
{
if (s1[i] == s2[j])
{
int tempcount=0;
for (int k1 = i,k2=j; k1 < s1.Length && k2<s2.Length; k1++,k2++)
{
if (s1[k1] == s2[k2])
{
tempcount++;
}
else
{
break;
}
}
if (tempcount > maxcount)
{
maxcount = tempcount;
}
}
}
}
return maxcount;
}</span>暴力解决,明显是三层循环啊,所以是O(n^3)
下面,让我们先看一下动态规划的优化第一步:计算len[i][j]=len[i-1][j-1](前提是两个字符相同的情况下)
<span style="font-size:18px;"> static int commonmax(string s1, string s2)
{
int[,] len=new int[s1.Length,s2.Length];
int max = 0;
for (int i = 0; i < s1.Length; i++)
{
for (int j = 0;j< s2.Length; j++)
{
if (s1[i] == s2[j])
{
if (i == 0 || j == 0)
{
len[i,j] = 1;
if (max < len[i,j])
{
max = len[i,j];
}
}
else
{
len[i,j] = len[i - 1,j - 1]+1;
if (max < len[i,j])
{
max = len[i,j];
}
}
}
else
{
len[i,j] = 0;
}
}
}
return max;
}</span>
画一个简图看一下:
(s2) b c d e
(s1)
a 0 0 0 0
b 1 0 0 0
c 0 2 0 0
d 0 0 3 0
首先题目意思是这样的:
两个字符串,求公共的连续子串的最大长度。
例如:s1: abcd s2:bcde 则最大公共子串长度是3
首先,让我们看一下暴力解决:
<span style="font-size:18px;"> static int common(String s1, String s2)
{
int maxcount = 0;
for (int i = 0; i < s1.Length; i++)
{
for (int j = 0; j < s2.Length; j++)
{
if (s1[i] == s2[j])
{
int tempcount=0;
for (int k1 = i,k2=j; k1 < s1.Length && k2<s2.Length; k1++,k2++)
{
if (s1[k1] == s2[k2])
{
tempcount++;
}
else
{
break;
}
}
if (tempcount > maxcount)
{
maxcount = tempcount;
}
}
}
}
return maxcount;
}</span>暴力解决,明显是三层循环啊,所以是O(n^3)
下面,让我们先看一下动态规划的优化第一步:计算len[i][j]=len[i-1][j-1](前提是两个字符相同的情况下)
<span style="font-size:18px;"> static int commonmax(string s1, string s2)
{
int[,] len=new int[s1.Length,s2.Length];
int max = 0;
for (int i = 0; i < s1.Length; i++)
{
for (int j = 0;j< s2.Length; j++)
{
if (s1[i] == s2[j])
{
if (i == 0 || j == 0)
{
len[i,j] = 1;
if (max < len[i,j])
{
max = len[i,j];
}
}
else
{
len[i,j] = len[i - 1,j - 1]+1;
if (max < len[i,j])
{
max = len[i,j];
}
}
}
else
{
len[i,j] = 0;
}
}
}
return max;
}</span>
画一个简图看一下:
(s2) b c d e
(s1)
a 0 0 0 0
b 1 0 0 0
c 0 2 0 0
d 0 0 3 0