1.2 多维数组(markdown版本)

多维数组这种数据结构,运用特别频繁。二维数组用于线性代数,三维数组用于Floyd-Warshall算法。当然还有别的用途。
这里按照套路,以一个需求开始。我选择了面试经常问的,经典的LCS问题,LCS是Longest Common Subsequence的缩写,也就是求最长共同子字符串的长度。
举个例子,两个字符串分别为:
ABCBDAB
BDCABC
最长的子字符串是BCAB(例子中加粗的部分)或BDAB。
对于这个问题,我们需要认真分析需求,需求是求子字符串,可以是不连续的,比如上例中的BCAB,在第一个字符串中就夹杂了BD两个字符。依旧使用高中数学的分类归纳法:

  1. 第一种场景,两个字符串尾部字母相同:
    如ABCBDABBDCAB
    那么LCS就是ABCBDABDCA的LCS加上字母B
  2. 第二种场景,两个字符串尾部字母不同:
    但是这种场景又分两种子场景:
  • 如ABCBDABBDCABC,这个场景那么LCS可能等于ABCBDABBDCAB的LCS(结果为BCAB);
  • 也可能等于ABCBDABDCABC的LCS(结果为ABC)。

两种我们肯定取更长的,所以取BCAB。定义两个字符串为X和Y。这种场景的LCS,需要计算X去掉尾部,Y不变的LCS和X不变,Y去掉尾部的LCS,然后取两个LCS之中的最长者。
所以可以定义一个二元函数d(x,y),x代表字符串X的索引,y代表字符串Y的索引。d(x,y)就是X从索引0到索引x的子串和Y从索引0到索引y的子串的LCS。
所以这个和二叉树数量的问题一样,也是递归问题。那么最合适的数据结构是什么?肯定是二维数组啊。二维数组有两个索引,一个索引表示X的子字符串长度,一个索引用来表示Y的子字符串长度。数组内存储两个子字符串的LCS。X去掉尾部就是行索引-1,Y去掉尾部就是列索引-1。
用公式描述就是:
d(x,y)={d(x−1,y−1)+1X[x]=Y[y]max(d(x−1,y),d(x,y−1))X[x]!=Y[y] d(x,y)=\begin{cases} d(x-1,y-1)+1 & X[x]=Y[y]\\ max(d(x-1,y),d(x,y-1)) & X[x]!=Y[y]\\ \end{cases}d(x,y)={d(x1,y1)+1max(d(x1,y),d(x,y1))X[x]=Y[y]X[x]!=Y[y]
上述字符串ABCBDABBDCABC产生的LCS长度二维数组是这样的:


代码实现


理清楚了需求,代码就比较容易写了,以下是python代码:

deflcs_len(x,y):len_x=len(x)len_y=len(y)array=[[0for_inrange(len_y+1)]for_inrange(len_x+1)]foriinrange(1,len_x+1):forjinrange(1,len_y+1):ifx[i-1]==y[j-1]:array[i][j]=array[i-1][j-1]+1else:a=array[i-1][j]b=array[i][j-1]array[i][j]=aifa>belsebforeinarray:print(e)returnarray[len_x][len_y]

因为python并没有真正的数组,所以这里补上java代码:

publicstaticintlcsLength(Stringx,Stringy){intlenX=x.length();intlenY=y.length();int[][]array=newint[lenX+1][lenY+1];for(inti=0;i<=lenX;i++){array[i][0]=0;}for(inti=0;i<=lenY;i++){array[0][i]=0;}for(inti=1;i<=lenX;i++){for(intj=1;j<=lenY;j++){if(x.charAt(i-1)==y.charAt(j-1)){array[i][j]=array[i-1][j-1]+1;}else{inta=array[i-1][j];intb=array[i][j-1];array[i][j]=a>b?a:b;}}}returnarray[lenX][lenY];}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1098189.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

160_尚硅谷_string和slice

160_尚硅谷_string和slice1.string和slice的区别 2.string底层是一个byte数组,因此string也可以进行切片处理案例演示 3.string和切片在内存的形式,以‘abcd‘画出内存示意图4.string是不可变的,也就说不能通过 str…

计算机Java毕设实战-基于SpringBoot+Vue的二手数码产品交易平台的开发与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

【Linux C++】采用回调链设计实现 signal 的全局处理实现 多个中断信号回调

如何在Linux C++ 程序中优雅地、统一管理 Signal 呢?答案就在下方—— 使用回调链的 SignalHandler方案代码// signal_handler.h #pragma once#include <atomic> #include <functional> #include <vec…

挠弹记录

记一个唐诗UB 看如下两份代码: har *big_multiply_fft(char *sa,char *sb){if (la<=0||lb<=0){char s[2]={0,\0};return s;} }har *big_multiply_fft(char *sa,char *sb){if (la<=0||lb<=0){char *s=mall…

UDP-酮半乳糖二钠盐——赋能前沿糖基化研究的核心工具分子

UDP-酮半乳糖二钠盐 (UDP-ketogalactose disodium salt) 是糖核苷酸家族中一个关键且具有独特反应活性的成员。作为细胞糖基化生物合成途径中的重要代谢中间体&#xff0c;它不仅是基础糖生物学研究的探针&#xff0c;更是探索新型生物合成路径与开发糖类衍生疗法的潜力分子。化…

把织物上的“轻微脏污”抓出来:客户下单50台

我们做了一套织物脏污检测方案,目标不是“实验室的算法”,而是​能在强纹理、曲面反光、褶皱阴影这些产线常态里稳定工作​。近期在外贸头部内衣胸杯客户现场验证跑通,客户已​预定数十台全检设备​,用于从抽检走向…

UDP-2-F-D-葡萄糖胺二钠盐—糖生物学研究与药物开发的关键工具分子

糖核苷酸是生命体内糖基化修饰的活化供体&#xff0c;直接参与多糖合成、蛋白质糖基化以及多种天然产物生物合成等核心生物过程&#xff0c;是连接碳水化合物代谢与复杂生命活动的重要桥梁。UDP-2-F-D-葡萄糖胺二钠盐作为一种经过特异性修饰的糖核苷酸类似物&#xff0c;为深入…

特斯拉为何死磕纯视觉?成本、数据与安全冗余的自动驾驶路线之争

在自动驾驶感知技术路线中&#xff0c;以激光雷达为核心的多传感器融合方案已成为行业主流。然而&#xff0c;特斯拉却始终坚持仅使用摄像头的纯视觉方案。这一选择背后&#xff0c;是成本控制、数据驱动与第一性原理思维的综合考量。本文将剖析特斯拉坚持纯视觉方案的核心逻辑…

论文AI率超标自救:五佳降AI工具合集

又到毕业季&#xff0c;毕业论文除了查重外&#xff0c;真的别忘记查ai率。 今天就告诉大家高重复率以及高ai率应该如何快速降低&#xff01;实测全网产品&#xff0c;无广&#xff01;&#xff01; 如果这篇整理能帮你少走点弯路&#xff0c;那就值了。 1、嘎嘎降AI 官网&…

摸鱼没翻车,全靠这套 Chrome 快捷键组合

摸鱼没翻车,全靠这套 Chrome 快捷键 我自己基本每天都在用,熟到手指都不用过脑子。 一、老板靠近时的「三连保命组合」 这三招,是底层逻辑,先记死。 1️⃣ 一键关掉当前摸鱼页 Ctrl + W 别犹豫,看到人影直接按。 …

【毕业设计】基于SpringBoot社区住户信息管理系统(源码+文档+远程调试,全bao定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

DaBai Max Pro 与 DaBai DCW2-DW2 深度相机坐标系解析

DaBai Max Pro 与 DaBai DCW2-DW2 深度相机坐标系解析DaBai Max Pro与DaBai DCW2-DW2&#xff08;奥比中光DaBai系列&#xff09;深度相机采用标准右手坐标系&#xff0c;原点位于相机焦点&#xff0c;单位为毫米&#xff0c;核心方向与转换规则如下&#xff1a;核心坐标系定义…

102301338郭砚康的软件工程课程总结 - Nicholas

102301338郭砚康的软件工程课程总结 一、学期回顾 1.1 回顾你对于软件工程课程的想象 在课程开始前,我心目中的软件工程主要是一门关于“如何更好地写代码”的课程,期望能学习系统的开发流程、团队协作模式以及项目管…

Java毕设项目:基于SpringBoot+Vue的二手数码产品交易平台的开发与实现(源码+文档,讲解、调试运行,定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

高达一亿港币人工智能创投基金,亚洲人工智能初创大赛上海站招募丨社区伙伴活动推荐

阅读更多 Voice Agent 学习笔记:了解最懂 AI 语音的头脑都在思考什么

论文被判AI生成?五佳降AI工具避坑分享

又到毕业季&#xff0c;毕业论文除了查重外&#xff0c;真的别忘记查ai率。 今天就告诉大家高重复率以及高ai率应该如何快速降低&#xff01;实测全网产品&#xff0c;无广&#xff01;&#xff01; 如果这篇整理能帮你少走点弯路&#xff0c;那就值了。 1、嘎嘎降AI 官网&…

Java计算机毕设之基于SpringBoot+Vue的二手数码产品交易平台的开发与实现(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

通信原理篇---误码率

第一部分&#xff1a;什么是误码率&#xff1f;——“游戏的总出错率”想象你和朋友隔着一个嘈杂的教室玩传话游戏&#xff0c;你说一句话&#xff0c;他写下来。误码率 就是&#xff1a;他写错的字数&#xff0c;除以你总共说的字数&#xff0c;得到的比例。公式&#xff1a;误…

【课程设计/毕业设计】基于SpringBoot+Vue的二手电子产品交易平台二手数码产品交易平台的开发与实现【附源码、数据库、万字文档】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

重复率过了AI率却超?这五佳降AI工具能用

又到毕业季&#xff0c;毕业论文除了查重外&#xff0c;真的别忘记查ai率。 今天就告诉大家高重复率以及高ai率应该如何快速降低&#xff01;实测全网产品&#xff0c;无广&#xff01;&#xff01; 如果这篇整理能帮你少走点弯路&#xff0c;那就值了。 1、嘎嘎降AI 官网&…