第一次写博客,为了激励自己努力。
前几天在牛客上看到一个算法题:
查找两个字符串的最大公共字符串长度。
自己是算法小白,学习了下动态规划的思想,写了个入门级的代码。
1.先用个例子简单梳理下分析过程,首先将字符串str1=“sdjhfdshklhfjk”和字符串str2 =“dffdshklu”以矩阵的形式排列(ps:后悔大学没好好学线代),然后按行从上到下,按列从左至右进行循环,不等的位置设为0,相等的位置由动态规划的思想(一篇很好的介绍动态归化算法的文章)设为res[i-1,j-1]+1,如
C#代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Arithmetic
{
class Program
{
static void Main(string[] args)
{
Dynamic();
}
/// <summary>
/// 动态规划 -- 求两个字符串的最大公共子串
/// </summary>
private static void Dynamic()
{
string childStr = string.Empty;
Console.WriteLine("请输入第一个字符串:");
string str1 = Console.ReadLine();
Console.WriteLine("请输入第二个字符串:");
string str2 = Console.ReadLine();
char[] arr1 = str1.ToCharArray();
char[] arr2 = str2.ToCharArray();
int[,] res = new int[arr2.Length,arr1.Length];
int max = 0; //记录最大值
int line = 0; //记录最大值所处的行数
for (int i = 0; i < arr2.Length; i++)
{
for (int j = 0; j < arr1.Length; j++)
{
res[0,0] = 0;
if (arr2[i] == arr1[j])
{
if (i == 0 || j == 0)
{
res[i, j] = 1;
}
else
{
res[i, j] = res[i - 1, j - 1] + 1;
}
}
else
{
res[i, j] = 0;
}
if (res[i, j] > max)
{
max = res[i,j];
line = i;
}
}
}
if (max == 0)
{
Console.WriteLine("不存在公共字符串");
Console.ReadLine();
return;
}
childStr = str2.Substring(line - max+1, max);
Console.WriteLine("最大公共字符串:"+childStr+",长度为:"+max);
Console.ReadLine();
}
}
}
运行结果如下图:
第一次写,mark下