常用算法理解
文章平均质量分 57
Morrisss_
做更好地自己。
展开
-
动态规划解最长递增子序列(O(n^2))
动态规划解最长递增子序列(O(n^2))核心 状态的定义:设dp[k]为到k项为止,最长递增子序列的长度; 状态方程的定义:dp[k] = max(dp[k], dp[i] + 1) | i < k && arr[i] < arr[k],需遍历前面所有项 Code// // main.cpp // LIS // // Created by Morris on 2016/9/7. // Cop原创 2016-09-12 10:09:57 · 751 阅读 · 0 评论 -
动态规划解最长公共子序列问题LCS(二)
动态规划解最长公共子序列问题LCS(二)核心定义 关于LCS使用动态规划求解的状态以及状态方程的定义在上文中已经做了介绍了,这里不再赘述。求解 对于需要输出所有LCS情况的要求,这里仅需要对上文中代码里的一些条件做修改即可。上文中仅能求解一种情况,主要原因在于比较dp[i - 1][j]与dp[i][j - 1]时,判断的条件没有单独列出等于的情况!要注意这点,我们可以从一张图中了解这个原创 2016-09-14 09:30:57 · 822 阅读 · 0 评论 -
字符串的包含问题
字符串的包含题目描述 给定字符串str1与字符串str2,求解str1是否包含str2中所有元素。注意,这不是求子串。如:”ABCD”与”BCA”,返回结果true;”ABCD”与”AA”返回结果true;”ABCD”与”BCE”返回结果false。解法一:蛮力轮询 对于str2中每个元素,到str1中去遍历一遍,若无,则在str1中使用的索引应该会超过str1的边界。具体代码如下:in原创 2016-09-20 11:50:30 · 421 阅读 · 0 评论 -
字符串匹配(KMP算法)
字符串匹配问题(KMP算法)问题描述 给定一个文本串S,现有一个模式串P,求P在S中出现的位置(第一次出现的位置)。前提 后文中会提到各种S串前进回退,P串前进回退,意指用于访问S串P串的指针或者迭代器的前进或者回退。后文为了简单,就直接写S串前进回退之类的了。暴力匹配 对于上述字符串匹配的问题,首先自然能想到的就是暴力匹配,以S中每个字符为起点,初始化一个迭代器进行循环,往后搜索原创 2016-10-10 20:30:01 · 853 阅读 · 0 评论 -
动态规划解最长公共子序列问题LCS(一)
动态规划解最长公共子序列问题LCS(一)修改于 2016-09-17 11:51:00关键定义 状态定义:设c[i, j]为子串Xi与Yj的LCS的长度,i和j都代表长度; 状态转移方程:假定X与Y的LCS为Z,X={x1, x2, …, xm},Y={y1, y2, …, yn},Z={z1, z2, …, zk}.对于这个问题,可以分3种情况:如果xm == yn,则表明xm与yn为两者LCS的原创 2016-09-17 11:53:05 · 677 阅读 · 0 评论 -
全排列生成算法
全排列生成算法概述 全排列问题,简单来说,就是由n个不同元素组成的序列,从中取出n个元素,按不同顺序排列起来。如:”123”,它的全排列为,”123”,”132”,”213”,”231”,”312”,”321”,总共有n!种结果。解法一:回溯法求解 对于求解所有可能情况的问题,回溯法不失为一种可以解决问题的方法。对于全排列生成,可以把序列的每一个字符作为一层,也可以说是,固定一个字符,对原创 2017-01-06 14:56:01 · 758 阅读 · 0 评论 -
括号匹配算法
括号匹配算法概述 括号匹配在很多字符串处理的场景中时常被用到,诸如各大IDE括号不匹配的错误提示,编译器编译时检查应该成对出现的括号是否符合要求等,在这里我们就直接使用一种比较常规,但效率不差的方法去解决括号匹配的问题就行了。栈方法匹配问题 为了方便描述,对于需要做匹配的两个符号,比如’(‘和’)’,前者可称为左侧符号,后者可称为右侧符号。在做符号匹配时,如果以左侧符号为标准,左侧符号需原创 2017-02-13 11:11:41 · 22564 阅读 · 3 评论