- 博客(12)
- 收藏
- 关注
原创 【动态规划】LCS算法:求两字符串最大公共字符串(连续)
LCS算法的应用问题描述:求两字符串的连续最大公共子字符串思路:根据上文LCS算法求解两字符串的最大公共子序列(不连续),可以得到求解连续子字符串的启示,如图所示,构造LCS矩阵vec,将两个字符串按矩阵方式排开,矩阵中的每个元素vec[i][j]表示字符串a的第i个字符和字符串b的第j个字符是否相等。如图1中所示。在斜对角线上,连续的1就表示两字符串对应位置连续相等。最长的连
2016-08-12 12:46:41
9622
1
原创 【动态规划】LCS算法:求两字符串最大公共子序列/删除字符使成为回文串
问题描述:给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?输出需要删除的字符个数。例如:输入:google 输出:2思路:回文串通常可以用逆序的方式寻找思路。例如字符串google逆序后elgoog,字符串alibaba逆序后ababila,可以发现求回文串的问题可以转换成求两个字符串的最大公共子序列的问题(序列可以不连续)。需要删除的
2016-08-11 21:20:41
1888
原创 【二叉树】二叉树排序树的判断、插入
二叉排序树,也称二叉搜索树,是指对于二叉树的所有结点,其左子树全部结点值小于该结点的值,右子树全部结点的值大于该结点的值。因此当我们中序遍历一棵二叉排序树时,得到的序列是一个递增序列。注意:二叉排序树中没有相等的两个元素。1.二叉排序树的插入将一个元素(保证与树中元素不等)插入一棵二叉排序树时,根据二叉排序树的特征,将其与根结点比较,小于根结点插入左子树,并继续与根结点的左孩子比较直到
2016-08-07 16:09:47
2010
原创 【二叉树】二叉树的创建、遍历、销毁、求树的最大深度
建立二叉树的链式存储结构,并对二叉树前序遍历、中序遍历、后序遍历以及层序遍历,求二叉树的深度,销毁二叉树。(1)二叉树的建立前序建立,即先建立根节点,再建立左子树,最后建立右子树,结点值的输入需要按照先序遍历的方式输入,以-1表示结点为空,例如一个深度为3的二叉树每层分别为1 ,2 3, 4 5 6 7,则应输入1 2 4 -1 -1 5 -1 -1 3 6 -1 -1 7 -1
2016-08-06 22:29:36
5890
原创 【栈】华为OJ:火车进站
华为OJ题目:火车进站题目描述:给定一个正整数N代表火车数量,0<N<10,接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1-9编号。要求以字典序排序输出火车出站的序列号。例如输入:3 1 2 3 输出例子:1 2 31 3 22 1 32 3 13 2 1格式要求:输出每组换行,每组数字间空格隔开,数字末尾不能有空格
2016-07-25 09:41:41
2172
原创 【栈】C++栈的建立、初始化、插入、删除
栈是限定在尾部进行插入或删除的线性表。表尾称为栈顶(top),表头称为栈底(base)。栈的修改按照后进先出的原则。栈有两种存储表示方法:顺序栈和链栈。顺序栈是利用一组连续存储单元依次存放栈底到栈顶数据元素的位置。链栈是没有附加头结点的运算受限的单链表。栈顶指针就是链表的头指针。注意:1.如果在函数中需要修改形参,而且希望函数结束后变量修改生效,可以使用引用的方法。例如把栈顶元素传
2016-07-22 16:03:31
29646
5
原创 【链表】C++链表创建、删除、排序,合并
实现C++链表的创建、删除、排序、合并(保持单调不减)思路:方法1:如果将两链表头尾相接后再整体排序,复杂度太高。因此可以利用链表已经排好序的特点进行逐步合并。用两个指针p1、p2指向两链表头结点head1、head2,并比较,显然,值小的为合并链表的头结点head,假如p1值较小,p1=head, p1后移,再与p2比较,值小的并入合并链表,并且指针加1,依次类推,直到某一个链表为空后,
2016-07-19 10:32:08
8801
原创 【链表】C++链表反转、链表逆序打印
题目:C++实现链表逆序打印、链表反转如何将链表逆序,取决于题目的要求。如果面试官只要求打印,一般不改动链表结构为好,如果要求改变链表的方向,则需要改变结构,再顺序打印。方法1:只逆序打印,不改变结构。采用递归,到达尾结点时打印输出,否则进入下一个结点的递归,当递归一层层退出的时候,便可以实现从尾到头的打印。方法2:头插法,改变结构。从第二个结点开始往后,依次把每个结点移至链表头部,要
2016-07-18 15:46:14
9441
3
原创 【链表】C++两个链表的公共结点
题目:(剑指offer编程题)输入两个单向链表,找出它们的第一个公共结点。公共结点是地址相同的两个结点,也就是同一个结点,由于是单向链表,所有从公共结点之后两链表重合。思路:方法1:最容易想到的办法是用两个循环,遍历第一个链表,对每一个元素遍历第二个链表,找相同的结点。这种算法时间复杂度为O(mn)(假设链表长度分别为m和n),不适用这种方法。方法2:如果两个链表有公共结点,那
2016-07-17 19:20:10
2342
原创 【链表】C++快慢两个指针解决问题(分别求倒数第k个、中间以及环的入口结点)
题目:输入一个单向链表,输出该链表中倒数第k个结点输入:循环输入(Ctrl+C结束输入):链表元素个数、各元素值、k,(如5 1 2 3 4 5 3)输出:输出每组倒数第k个结点的值思路:常规思路可以遍历链表记录长度,再次遍历找到第len-k+1个结点即是倒数第k个。更好也是很经典的一个办法,设置两个指针指向头结点,前指针先走k-1步,此时后指针开始与前指针同步走,保持指针之间距离为k
2016-07-17 18:46:21
524
原创 【字符串】C++字符串编程小结
【1】求字符串长度char数组: strlen(数组名)所在头文件:#include或者#includestring字符串: 数组名.size()【2】字符串复制拼接char数组: 复制 strcpy(charr1,charr2)注意;是全部替换 所在头文件:#include拼接 strcat(charr1,charr2)注意:把以charr2为地址开始的字
2016-07-16 19:26:58
478
原创 【链表】C++删除链表中重复的结点
题目: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5注意要删除的是所有重复的,而不是删除多余的。开始理解成1-2-3-4-5,事实证明全部删除比删除多余复杂挺多。我尝试了三种方法,牛客网上运行通过,思路如下:(1)遍历链表,重复的数字置0,如1-2
2016-07-16 18:36:59
5612
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人