代码改变世界

随笔分类 -  算法---字符串

转:2个指针位置的妙用

2013-10-05 16:24 by youxin, 542 阅读, 收藏, 编辑
摘要: 使用两个指针可以轻松的解决许多算法问题,归纳出如下几种1、 判断链表是否带环带环链表的判断是链表中经常考察的内容。一个循环链表可以无休止地遍历下去。我们可以定义两个指针,一个快指针一个慢指针,如果在遍历到尾端前二者相遇,那么链表就是有环链表bool haveCycle(LinkList * Head... 阅读全文

算法导论练习6.5-8 k路合并

2013-09-05 16:30 by youxin, 713 阅读, 收藏, 编辑
摘要: 题目:请给出一个时间为O(nlgk)、用来将k个已排序链表合并为一个排序链表的算法。此处n为所有输入链表中元素的总数。(提示:用一个最小堆来做k路合并。 看到题目第个想到的是归并排序过程中的归并操作子过程,从头开始两两比较,找出最小的,然后接着往后比较,常用的是2路归并。而题目给的是k个已排好序的链表(k>=2)。如果没有提示,我半天不知道如何去实现,幸好提示说用最小堆来做k路合并,于是我想到可以这样做:创建一个大小为k的数组,将k个链表中的第一个元素依次存放到数组中,然后将数组调整为最小堆,这样保证数组的第一个元素是最小的,假设为min,将min从最小堆取出并存放到最终结果的链表中,此 阅读全文

Boyer–Moore (BM)字符串搜索算法

2013-09-04 15:24 by youxin, 681 阅读, 收藏, 编辑
摘要: 在计算机科学里,Boyer-Moore字符串搜索算法是一种非常高效的字符串搜索算法。它由Bob Boyer和J Strother Moore设计于1977年。此算法仅对搜索目标字符串(关键字)进行预处理,而非被搜索的字符串。虽然Boyer-Moore算法的执行时间同样线性依赖于被搜索字符串的大小,但是通常仅为其它算法的一小部分:它不需要对被搜索的字符串中的字符进行逐一比较,而会跳过其中某些部分。通常搜索关键字越长,算法速度越快。它的效率来自于这样的事实:对于每一次失败的匹配尝试,算法都能够使用这些信息来排除尽可能多的无法匹配的位置。假设被检索文字列是“1234567890”,检索文字列是“MO 阅读全文

面试题:最长回文子串(即求对称字符串的最大长度 )

2013-09-01 03:44 by youxin, 472 阅读, 收藏, 编辑
摘要: 题目:输入一个字符串,输出该字符串中对称的子字符串的最大长度。比如输入字符串“google”,由于该字符串里最长的对称子字符串是“goog”, 因此输出4。分析:可能很多人都写过判断一个字符串是不是对称的函数,这个题目可以看成是该函数的加强版。 阅读全文

百度面试题:把数组排成最小的数

2013-09-01 03:30 by youxin, 1827 阅读, 收藏, 编辑
摘要: 问题描述:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。例如输入数组{32, 321},则输出这两个能排成的最小数字32132。请给出解决问题的算法,并证明该算法。很显然,数前面的越小越好。 思路:先将整数数组转为字符串数组,然后字符串数组进行排序,最后依次输出字符串数组即可。这里注意的是字符串的比较函数需要重新定义,不是比较a和b,而是比较ab与 ba。如果ab ba,则a > b;如果ab = ba,则a = b。比较函数的定义是本解决方案的关键。这道题其实就是希望我们能找到一个排序规则,根据这个规则排出来的数组能排成一个最小的数字。证明:为什么这样 阅读全文

面试题:在O(1)时间删除链表结点

2013-09-01 03:20 by youxin, 407 阅读, 收藏, 编辑
摘要: 题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。链表结点与函数的定义如下:struct ListNode{ int m_nValue; ListNode* m_pNext;};void DeleteNode(ListNode** pListHead,ListNode* pToBeDeleted);删除结点的操作我们经常碰到,比如一个链表A->B->C->D->E->F->G。如果我们要删除结点E,那么我们只需要让结点D的指针指向结点F即可,但是我们现在只给出链表头结点的指针以及结点E的指针,而又是单项链表,不能在O(1)时间内 阅读全文

从第一字符串中删除第二个字符串中所有的字符

2013-09-01 02:39 by youxin, 2729 阅读, 收藏, 编辑
摘要: 题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的字符串变成”Thy r stdnts.”。分析:题目可分解为如何判断一个字符串中包含特定字符以及如何在一个字符串中删除特定字。判断一个字符串是否包含是定字符,可首先创建一个字符串的Hash表,把字符串中对应的字符对代表的hash元素置为1.字符参数所代表Hash元素值是为1就表示字符存在。(这种“字符串hash”的思想要掌握,可以快速在一些字符中查找某个字符)在一个字符串中删除指定字符,比较好的方法是通过快慢消除法。具体实现如下:#include # 阅读全文

删除字符串中的数字并压缩字符串

2013-08-31 20:27 by youxin, 2085 阅读, 收藏, 编辑
摘要: 题目:删除字符串中的数字并压缩字符串 。如字符串”abc123de4fg56”处理后变为”abcdefg”。注意空间和效率。分析:可用两个索引指向字符串的开头,一个向后推进作为循环条件,另一个跨过数据向后推进。达到消除数据及压缩操作。 一快一慢,可称为快慢消除法。/***************************************************************************************删除字符串中的数字并压缩字符串题目:删除字符串中的数字并压缩字符串 。如字符串”abc123de4fg56”处理后变为”abcdefg”。注意空间和效率... 阅读全文

转:关于数组的几道面试题

2013-08-27 02:14 by youxin, 286 阅读, 收藏, 编辑
摘要: 这是一篇写的非常好的文章,对常见的数组习题进行了讲解。数组是最基本的数据结构,关于数组的面试题也屡见不鲜,本文罗列了一些常见的面试题,仅供参考,如果您有更好的题目或者想法,欢迎留言讨论。目前有以下18道题目,如果有好的题目,随时更新。数组求和求数组的最大值和最小值求数组的最大值和次大值求数组中出现次数超过一半的元素求数组中元素的最短距离求两个有序数组的共同元素求三个数组的共同元素找出数组中唯一的重复元素找出出现奇数次的元素求数组中满足给定和的数对最大子段和最大子段积数组循环移位字符串逆序组合问题合并两个数组重排问题找出绝对值最小的元素http://www.cnblogs.com/graphic 阅读全文

c显示数字的LED(数字转LED)

2013-08-26 01:03 by youxin, 1077 阅读, 收藏, 编辑
摘要: 实现这么一个函数:传入一个int值,在屏幕输出类似LED显示屏效果的字母拼图,例如:输入1234567890,输出:请注意每个字符的固定宽度和高度,两个数字间保留一个空格。函数名:voidLEDprint(intnum);此题是表驱动方法的典型应用。#include#include#include#includeusing namespace std;//每个字符宽度为5,长度为7string LEDarray[][7]={ {" --- ", //0 "| |", "| |", "| |", "| |& 阅读全文

KMP算法与一个经典概率问题

2013-08-22 16:44 by youxin, 410 阅读, 收藏, 编辑
摘要: 考虑一个事件,它有两种概率均等的结果。比如掷硬币,出现正面和反面的机会是相等的。现在我们希望知道,如果我不断抛掷硬币,需要多长时间才能得到一个特定的序列。序列一:反面、正面、反面序列二:反面、正面、正面首先,我反复抛掷硬币,直到最近的三次抛掷结果形成序列一,然后我记下这次我抛掷了多少次才得到了我要... 阅读全文

matrix67:kmp算法详解

2013-08-22 16:36 by youxin, 1018 阅读, 收藏, 编辑
摘要: 个人认为KMP是最没有必要讲的东西,因为这个东西网上能找到很多资料。但网上的讲法基本上都涉及到“移动(shift)”、“Next函数”等概念,这非常容易产生误解(至少一年半前我看这些资料学习KMP时就没搞清楚)。在这里,我换一种方法来解释KMP算法。假如,A="abababaababacb",B="ababacb",我们来看看KMP是怎么工作的。我们用两个指针i和j分别表示,A[i-j+ 1..i]与B[1..j]完全相等。也就是说,i是不断增加的,随着i的增加j相应地变化,且j满足以A[i]结尾的长度为j的字符串正好匹配B串的前 j个字符(j当然越大越 阅读全文

C的memset,memcpy,strcpy 的区别 及memset memcpy memmove源码

2013-08-20 20:52 by youxin, 1333 阅读, 收藏, 编辑
摘要: extern void *memcpy(void *dest,void *src,unsigned int count);#include 功能:由src所指内存区域复制count个字符串到dest所指内存区域. 说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针. memse... 阅读全文

字符串操作函数<string.h>相关函数strcpy,strcat,等源码。

2013-08-20 20:35 by youxin, 4830 阅读, 收藏, 编辑
摘要: 首先说一下源码到底在哪里找。我们在文件中包含时,如果点击右键打开文档,会打开cstring,我们会发现路径为:D:\Program Files\visual studio\VC\include\cstring这个文件内容如下:// cstring standard header#pragma once#ifndef _CSTRING_#define _CSTRING_#include #ifdef _STD_USING #undef _STD_USING #include #define _STD_USING#else /* _STD_USING */ #include #endif /*.. 阅读全文

区间重合判断(pojg校门外的树)

2013-08-18 21:54 by youxin, 7421 阅读, 收藏, 编辑
摘要: pojg;http://poj.grids.cn/practice/2808解法1:以空间换时间:#include#includeint main(){ int L,M; scanf("%d%d",&L,&M); bool *a=new bool[10001]; memset(a,1,sizeof(bool)*10001); int m,n; for(int i=1;i#includetypedef struct Line{ int start; int end;}Line;int compareLine(const void *a,const ... 阅读全文

kmp算法

2013-08-17 13:47 by youxin, 295 阅读, 收藏, 编辑
摘要: 先看这篇文章:http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html重要的部分:下面介绍《部分匹配表》是如何产生的。首先,要了解两个概念:"前缀"和"后缀"。 "前缀"指除了最后一个字符以外,一个字符串的全部头部组合;"后缀"指除了第一个字符以外,一个字符串的全部尾部组合。15."部分匹配值"就是"前缀"和"后缀"的最长的共有元素的长度 阅读全文

pojg2744找一个最长的字符串x,使得对于已经给出的字符串中的任意一个y,x或者是y的子串,或者x中的字符反序之后得到的新字符串是y的子串。

2013-08-06 21:59 by youxin, 2714 阅读, 收藏, 编辑
摘要: http://poj.grids.cn/practice/2744描述现在有一些由英文字符组成的大小写敏感的字符串,你的任务是找到一个最长的字符串x,使得对于已经给出的字符串中的任意一个y,x或者是y的子串,或者x中的字符反序之后得到的新字符串是y的子串。输入输入的第一行是一个整数t (1 d:\program files\visual studio\vc\include\string.h(250) : 参见“strrev”的声明strrev有些编译器可能不支持,用标准的,前面加一个_即可。要熟练的使用几个字符串处理函数:char * strncpy(char *dest,... 阅读全文

pojg487-3279电话号码转换(字符映射)

2013-08-06 16:58 by youxin, 1435 阅读, 收藏, 编辑
摘要: http://poj.grids.cn/practice/2974注意输入中连字符可以任意添加和删除。描述企业喜欢用容易被记住的电话号码。让电话号码容易被记住的一个办法是将它写成一个容易记住的单词或者短语。例如,你需要给滑铁卢大学打电话时,可以拨打TUT-GLOP。有时,只将电话号码中部分数字拼写成单词。当你晚上回到酒店,可以通过拨打310-GINO来向Gino's订一份pizza。让电话号码容易被记住的另一个办法是以一种好记的方式对号码的数字进行分组。通过拨打必胜客的“三个十”号码3-10-10-10,你可以从他们那里订pizza。电话号码的标准格式是七位十进制数,并在第三、第四位数 阅读全文

c语言统计字符数(判断a-z哪个字符出现次数最多)

2013-08-06 16:17 by youxin, 7204 阅读, 收藏, 编辑
摘要: http://poj.grids.cn/practice/2742描述判断一个由a-z这26个字符组成的字符串中哪个字符出现的次数最多输入第1行是测试数据的组数n,每组测试数据占1行,是一个由a-z这26个字符组成的字符串每组测试数据之间有一个空行,每行数据不超过1000个字符且非空输出n行,每行输出对应一个输入。一行输出包括出现次数最多的字符和该字符出现的次数,中间是一个空格。如果有多个字符出现的次数相同且最多,那么输出ascii码最小的那一个字符样例输入2abbcccadfadffasdf样例输出c 3f 4我们可以设置一个数组sum[26];用来自己了输入字符串中每个字母的出现数字,字母 阅读全文

数组循环移位(动) 问题

2013-08-06 15:36 by youxin, 1137 阅读, 收藏, 编辑
摘要: 设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N),且只允许使用两个附加变量。不合题意的解法如下: 我们先试验简单的办法,可以每次将数组中的元素右移一位,循环K次。abcd1234--->4abcd123--->34abcd12--->234abcd1--->1234abcd。代码如下所示:void rightShift(char *a,int N,int k){ while(k--) { char tmp=a[N-1]; for(int i=N-1;i>=1;i--) { a[i]=a[i-... 阅读全文