算法 二维数组
1.最长公共子序列
static int[,] martix; static string str1 = "cnblogs"; static string str2 = "belong"; protected void Page_Load(object sender, EventArgs e) { martix = new int[str1.Length + 1, str2.Length + 1]; LCS(str1, str2); Response.Write("<br><br><br><br><br><br>"); GetArr(martix); //只要拿出矩阵最后一个位置的数字即可 //Response.Write(String.Format("当前最大公共子序列的长度为:{0}<br>", martix[str1.Length, str2.Length])); } static void LCS(string str1, string str2) { //初始化边界,过滤掉0的情况 for (int i = 0; i <= str1.Length; i++) martix[i, 0] = 0; for (int j = 0; j <= str2.Length; j++) martix[0, j] = 0; //填充矩阵 for (int i = 1; i <= str1.Length; i++) { for (int j = 1; j <= str2.Length; j++) { //相等的情况 if (str1[i - 1] == str2[j - 1]) { martix[i, j] = martix[i - 1, j - 1] + 1; } else { //比较“左边”和“上边“,根据其max来填充 if (martix[i - 1, j] >= martix[i, j - 1]) martix[i, j] = martix[i - 1, j]; else martix[i, j] = martix[i, j - 1]; } } } } public static void GetArr(int[,] arr) { int x = arr.GetUpperBound(0); int y = arr.GetUpperBound(1); for (int i = 0; i <= x; i++) { StringBuilder strBuilder = new StringBuilder(); strBuilder.Append(" "); for (int j = 0; j <= y; j++) { strBuilder.Append(arr[i, j].ToString() + " "); } HttpContext.Current.Response.Write(strBuilder.ToString() + "<br><br><br>"); } }
总结:就是在边上加一圈零,比较相对应的字符,相等,值就等于左上角的值,
不相等,值就去左边和上边的最大值。
2.字符串相似度
static int[,] martix; static string str1 = "dhongda"; static string str2 = "fehongda"; protected void Page_Load(object sender, EventArgs e) { martix = new int[str1.Length + 1, str2.Length + 1]; LCS(str1, str2); Response.Write("<br><br><br><br><br><br>"); GetArr(martix); //只要拿出矩阵最后一个位置的数字即可 //Response.Write(String.Format("当前最大公共子序列的长度为:{0}<br>", martix[str1.Length, str2.Length])); } static void LCS(string str1, string str2) { //初始化边界值(忽略计算时的边界情况) for (int i = 0; i <= str1.Length; i++) { martix[i, 0] = i; } for (int j = 0; j <= str2.Length; j++) { martix[0, j] = j; } //矩阵的 X 坐标 for (int i = 1; i <= str1.Length; i++) { //矩阵的 Y 坐标 for (int j = 1; j <= str2.Length; j++) { //相等情况 if (str1[i - 1] == str2[j - 1]) { martix[i, j] = martix[i - 1, j - 1]; } else { //取“左前方”,“上方”,“左方“的最小值 var temp1 = Math.Min(martix[i - 1, j], martix[i, j - 1]); //获取最小值 var min = Math.Min(temp1, martix[i - 1, j - 1]); martix[i, j] = min + 1; } } } } public static void GetArr(int[,] arr) { int x = arr.GetUpperBound(0); int y = arr.GetUpperBound(1); for (int i = 0; i <= x; i++) { StringBuilder strBuilder = new StringBuilder(); strBuilder.Append(" "); for (int j = 0; j <= y; j++) { strBuilder.Append(arr[i, j].ToString() + " "); } HttpContext.Current.Response.Write(strBuilder.ToString() + "<br><br><br>"); } }
总结:就是在边上加一圈零,比较相对应的字符,相等,值就等于左上角的值,
不相等,值就去左边,左上角和上边的最小值,就是四角中最小的,再加1.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)