最短路径

1055. 形成字符串的最短路径

风流意气都作罢 提交于 2020-04-06 19:44:52
描述 对于任何字符串,我们可以通过删除其中一些字符(也可能不删除)来构造该字符串的子序列。 给定源字符串 source 和目标字符串 target,找出源字符串中能通过串联形成目标字符串的子序列的最小数量。如果无法通过串联源字符串中的子序列来构造目标字符串,则返回 -1。 示例 1: 输入:source = "abc", target = "abcbc" 输出:2 解释:目标字符串 "abcbc" 可以由 "abc" 和 "bc" 形成,它们都是源字符串 "abc" 的子序列。 示例 2: 输入:source = "abc", target = "acdbc" 输出:-1 解释:由于目标字符串中包含字符 "d",所以无法由源字符串的子序列构建目标字符串。 示例 3: 输入:source = "xyz", target = "xzyxz" 输出:3 解释:目标字符串可以按如下方式构建: "xz" + "y" + "xz"。 思路 双指针法,每次在target中查找source的子序列,总和不超过target的长度。 class Solution { public: int shortestWay(string source, string target) { int i=0,j=0,count=0; while(j<target.size()&&count<target.size()

数据结构和算法系列17 图

ε祈祈猫儿з 提交于 2020-04-03 11:49:52
数据结构和算法系列17 图 阅读目录 一,图的定义 二,图相关的概念和术语 三,图的创建和遍历 四,最小生成树和最短路径 五,算法实现 这一篇我们要总结的是图(Graph),图可能比我们之前学习的线性结构和树形结构都要复杂,不过没有关系,我们一点一点地来总结,那么关于图我想从以下几点进行总结: 1,图的定义? 2,图相关的概念和术语? 3,图的创建和遍历? 4,最小生成树和最短路径? 5,算法实现? 回到顶部 一,图的定义 什么是图呢? 图是一种复杂的非线性结构。 在线性结构中,数据元素之间满足唯一的线性关系,每个数据元素(除第一个和最后一个外)只有一个直接前趋和一个直接后继; 在树形结构中,数据元素之间有着明显的层次关系,并且每个数据元素只与上一层中的一个元素(双亲节点)及下一层的多个元素(孩子节点)相关; 而在图形结构中,节点之间的关系是任意的,图中任意两个数据元素之间都有可能相关。 图G由两个集合V(顶点Vertex)和E(边Edge)组成,定义为G=(V,E) 回到顶部 二,图相关的概念和术语 1,无向图和有向图 对于一个图,若每条边都是没有方向的,则称该图为无向图。图示如下: 因此,(V i ,V j )和(V j, V i )表示的是同一条边。注意, 无向图是用小括号,而下面介绍的有向图是用尖括号。 无向图的顶点集和边集分别表示为: V(G)={V 1 ,V 2 ,V

数据结构

烈酒焚心 提交于 2020-04-03 11:48:27
一,图的定义 什么是图呢? 图是一种复杂的非线性结构。 在线性结构中,数据元素之间满足唯一的线性关系,每个数据元素(除第一个和最后一个外)只有一个直接前趋和一个直接后继; 在树形结构中,数据元素之间有着明显的层次关系,并且每个数据元素只与上一层中的一个元素(双亲节点)及下一层的多个元素(孩子节点)相关; 而在图形结构中,节点之间的关系是任意的,图中任意两个数据元素之间都有可能相关。 图G由两个集合V(顶点Vertex)和E(边Edge)组成,定义为G=(V,E) 回到顶部 二,图相关的概念和术语 1,无向图和有向图 对于一个图,若每条边都是没有方向的,则称该图为无向图。图示如下: 因此,(V i ,V j )和(V j, V i )表示的是同一条边。注意, 无向图是用小括号,而下面介绍的有向图是用尖括号。 无向图的顶点集和边集分别表示为: V(G)={V 1 ,V 2 ,V 3 ,V 4 ,V 5 } E(G)={(V 1 ,V 2 ),(V 1 ,V 4 ),(V 2 ,V 3 ),(V 2 ,V 5 ),(V 3 ,V 4 ),(V 3 ,V 5 ),(V 4 ,V 5 )} 对于一个图G,若每条边都是有方向的,则称该图为有向图。图示如下。 因此,<V i ,V j >和<V j, V i >是两条不同的有向边。注意,有向边又称为弧。 有向图的顶点集和边集分别表示为: V(G)

数据结构和算法系列-------- 图

眉间皱痕 提交于 2020-04-03 11:47:50
原文地址 http://www.cnblogs.com/mcgrady/archive/2013/09/23/3335847.html#_label2 阅读目录 一,图的定义 二,图相关的概念和术语 三,图的创建和遍历 四,最小生成树和最短路径 五,算法实现 这一篇我们要总结的是图(Graph),图可能比我们之前学习的线性结构和树形结构都要复杂,不过没有关系,我们一点一点地来总结,那么关于图我想从以下几点进行总结: 1,图的定义? 2,图相关的概念和术语? 3,图的创建和遍历? 4,最小生成树和最短路径? 5,算法实现? 一,图的定义 什么是图呢? 图是一种复杂的非线性结构。 在线性结构中,数据元素之间满足唯一的线性关系,每个数据元素(除第一个和最后一个外)只有一个直接前趋和一个直接后继; 在树形结构中,数据元素之间有着明显的层次关系,并且每个数据元素只与上一层中的一个元素(双亲节点)及下一层的多个元素(孩子节点)相关; 而在图形结构中,节点之间的关系是任意的,图中任意两个数据元素之间都有可能相关。 图G由两个集合V(顶点Vertex)和E(边Edge)组成,定义为G=(V,E) 二,图相关的概念和术语 1,无向图和有向图 对于一个图,若每条边都是没有方向的,则称该图为无向图。图示如下: 因此,(V i ,V j )和(V j, V i )表示的是同一条边。注意, 无向图是用小括号

46-Dijkstra算法

£可爱£侵袭症+ 提交于 2020-04-01 13:52:48
0. 应用场景 1. 概述 Dijkstra算法 是典型单源最短路径算法,用于计算一个顶点到其他顶点的最短路径 单源:从一个顶点出发,Dijkstra算法 只能求一个顶点到其他点的最短距离而不能任意两顶点 用于无权图,或者所有边的权都相等的图,Dijkstra 算法等同于BFS搜索 特点:以起始点为中心向外层层扩展( 广度优先搜索思想 ),直到扩展到终点为止 Dijkstra算法 用于对有权图进行搜索,找出图中两点的最短距离,既不是DFS搜索,也不是BFS搜索 2. 基本思想 设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组 第 1 组为已求出最短路径的顶点集合 (用S表示),初始时S中只有一个起点,以后每求得一条最短路径 , 就将加入到集合S中,直到全部顶点都加入到S中,算法就结束了 第 2 组为其余未确定最短路径的顶点集合 (用U表示),按 最短路径长度的递增次序 依次把第 2 组的顶点加入S中,在加入的过程中,总保持 从起点s到S中各顶点的最短路径长度 不大于 从起点s到U中任何顶点的最短路径长度 此外,每个顶点对应一个距离 S中的顶点的距离就是从v到此顶点的最短路径长度 U中的顶点的距离,是从v到此顶点 只包括S中的顶点为中间顶点 的当前最短路径长度 初始时,S中只有起点s;U中是除s之外的顶点,并且U中顶点的路径是"起点s到该顶点的路径"。然后

2020.3.25阿里笔试题

走远了吗. 提交于 2020-03-29 18:47:36
1:题目描述 作者:海森堡CSQ 链接: https://www.nowcoder.com/discuss/391530?type=post&order=time&pos=&page=1 来源:牛客网 第一题,给定一个数组n,比如 5 10 5 4 4 1 7 8 4 0 3 4 9 0 3 从每一列选择一个数,求出后一列减去前一列的绝对值的和的最小值 比如这里就是5 7 5 4 4,所以输出是5 2:解题思路   本地我们经过分析,可以明确发现本列最短路径和下一列最短路径之间有很大的关系,我们可以使用动态规划的思想解决这个问题; 状态定义:如何定义出可以找到转移方程的状态,是这个问题的关键。我们分析发现相邻两列之间的最短路径之间关系如下;假设dp[0],dp[1]和dp[2]分别代表从第一列到达此列的第0行数,第1行数,第2行数的最短路径,那么到达后一列的第0行,第1行和第2行的最短路径和dp[0],dp[1],dp[2]有什么关系尼?显然假设后一列第0行,第1行,第2行的最短路径分别为next[0],next[1],next[2],第0行数据为 n[0],第1行数据为 n[1],第2行数据为 n[2],则有,next[0] = min(abs(dp[0]-n[0]),abs(dp[1]-n[0]),abs(dp[2]-n[0]))。这是什么含义尼?就是本列的三行分别到n[0

图论之最短路径(1)——Floyd Warshall & Dijkstra算法

六月ゝ 毕业季﹏ 提交于 2020-03-27 09:06:43
开始图论学习的第二部分:最短路径。 由于知识储备还不充足,暂时不使用邻接表的方法来计算。 最短路径主要分为两部分:多源最短路径和单源最短路径问题 多源最短路径: 介绍最简单的Floyd Warshall算法: 思路如下:把所有从顶点i到j可能经过的顶点一一枚举,不断更新从i到j的最小权值:d[i][j] = min{d[i][j],d[i][k]+d[k][j]},是一种动规的思想 局限性:不能处理有负权回路(负圈)的情况,而且一般是使用邻接矩阵的方式来实现。 优劣性:思路简单,核心代码简洁易懂,但是时间复杂度为O(N^3)效率较差,适合处理小范围数据。 核心代码只有5行: for (int k = 1; k <= n; k++) for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) if (e[i][j]>e[i][k] + e[k][j]) e[i][j] = [i][k] + e[k][j]; 在情况不是特别复杂的情况下也可以用来求解单源最短路径问题 单源最短路径: 先介绍简单的Dijkstra算法 核心思路:假设计算从顶点1到其余各顶点的最短路径。先用一个一维数组dis储存1号顶点到其余各顶点的初始路程(这时每个值被称为估计值),找到一个离1的距离最小的顶点,比如2,那么dis[2]的值就成为确定值

最短路径:(Dijkstra & Floyd)

丶灬走出姿态 提交于 2020-03-27 07:59:34
Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的 单源最短路径算法 ,用于计算一个节点到其他所有节点的最短路径。主要特点是 以起始点为中心向外层层扩展,直到扩展到终点为止 。Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。 注意该算法要求图中不存在负权边 。 问题描述:在无向图 G=(V,E) 中,假设每条边 E[i] 的长度为 w[i],找到由顶点 V0 到其余各点的最短路径。(单源最短路径) 2.算法描述 1)算法思想:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组, 第一组为已求出最短路径的顶点集合 (用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将加入到集合S中,直到全部顶点都加入到S中,算法就结束了), 第二组为其余未确定最短路径的顶点集合(用U表示), 按最短路径长度的递增次序依次把第二组的顶点加入S中。在加入的过程中,总保持从 源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度 。此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中的顶点的距离,是从v到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。 2)算法步骤: a.初始时, S只包含源点 ,即S={v},v的距离为0

PAT 二刷记录

时光总嘲笑我的痴心妄想 提交于 2020-03-26 12:46:59
https://pintia.cn/problem-sets/994805342720868352/problems/994805523835109376 最短路径问题:结点权值+最短路径个数统计+最短路径; 来源: https://www.cnblogs.com/songlinxuan/p/12573378.html

Dijkstra最短路径算法[贪心]

偶尔善良 提交于 2020-03-19 09:07:33
Dijkstra算法的标记和结构与prim算法的用法十分相似。它们两者都会从余下顶点的优先队列中选择下一个顶点来构造一颗扩展树。但千万不要把它们混淆了。它们解决的是不同的问题,因此,所操作的优先级也是以不同的方式计算的:Dijkstra算法比较路径的长度,因此必须把边的权重相加,而prim算法则直接比较给定的权重。 源最短路径问题 给定一个带权有向图 G=(V,E) ,其中每条边的权是一个非负实数。另外,还给定 V 中的一个顶点,称为源。现在我们要计算从源到所有其他各顶点的最短路径长度。这里的长度是指路上各边权之和。这个问题通常称为单源最短路径问题。 前面 Bellman-Ford最短路径算法 讲了单源最短路径的Bellman-Ford算法(动态规划算法)。这里介绍另外一个更常见的算法Dijkstra算法。 Dijkstra算法和 最小生成树Prim算法 最小生成树算法非常类似,大家可以先熟悉下个算法。两个算法都是基于贪心算法。虽然Dijkstra算法相对来说比Bellman-Ford 算法更快,但是不适用于有负权值边的图,贪心算法决定了它的目光短浅。而Bellman-Ford 算法从全局考虑,可以检测到有负权值的回路。 这里模仿MST(Minimum Spanning Tree)的Prim算法,我们创建一个SPT(最短路径树),最初只包含源点。我们维护两个集合