
算法-字符串
Edwards_June
Just For My Interest
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
找出字串的最长重复子串
一个长度为10000的字符串,写一个算法,找出最长的重复子串,如abczzacbca,结果是bc。提示:此题是后缀树/数组的典型应用,即是求后缀数组的height[]的最大值。#include #include #define SIZE 5000char str[SIZE], *pstr[SIZE];int cmpLen(char* p, char* q) { int le原创 2017-01-13 11:44:06 · 2376 阅读 · 0 评论 -
最长连续字符
用递归算法写一个函数,求字符串最长连续字符的长度,比如aaaabbcc的长度为4,aabb的长度为2,ab的长度为1。int findMaxRepeatStrLength(char* src, int curIndex) { if (!src || *(src + curIndex) == '\0') { return 0; } int len = 1; int i = 1; w原创 2017-01-12 22:03:28 · 558 阅读 · 0 评论 -
字符串的压缩
一个字符串,压缩其中的连续空格为1个后,对其中的每个字串逆序打印出来。比如"abc efg hij"打印为"cba gfe jih"。#include #include char* composeStr(char* src) { int len = strlen(src); char* dest = calloc(sizeof(char), len + 1); //i源字符串遍历下标原创 2017-01-12 21:04:35 · 478 阅读 · 0 评论 -
五笔编码
五笔的编码范围是a ~ y的25个字母,从1位到4位的编码,如果我们把五笔的编码按字典序排序,形成一个数组如下:a, aa, aaa, aaaa, aaab, aaac, … …, b, ba, baa, baaa, baab, baac … …, yyyw, yyyx, yyyy其中a的Index为0,aa的Index为1,aaa的Index为2,以此类推。编写一个函数,输入是任原创 2017-01-12 20:45:41 · 719 阅读 · 0 评论 -
字符串的集合
给定一个字符串的集合,格式如:{aaa bbb ccc}, {bbb ddd},{eee fff},{ggg},{ddd hhh}要求将其中交集不为空的集合合并,要求合并完成后的集合之间无交集,例如上例应输出{aaa bbb ccc ddd hhh},{eee fff}, {ggg}。提示:并查集。#include #include #define SIZE 5int MLEN =原创 2017-01-12 20:42:17 · 1166 阅读 · 0 评论 -
最小子串(改进版)
给一篇文章,里面是由一个个单词组成,单词中间空格隔开,再给一个字符串指针数组,比如 char *str[]={"hello","world","good"};求文章中包含这个字符串指针数组的最小子串。注意,只要包含即可,没有顺序要求。提示:文章也可以理解为一个大的字符串数组,单词之前只有空格,没有标点符号。#include #include /* *截取字符串 */char原创 2017-01-12 20:40:04 · 380 阅读 · 0 评论 -
最小子串
给一篇文章,里面是由一个个单词组成,单词中间空格隔开,再给一个字符串指针数组,比如 char *str[]={"hello","world","good"};求文章中包含这个字符串指针数组的最小子串。注意,只要包含即可,没有顺序要求。提示:文章也可以理解为一个大的字符串数组,单词之前只有空格,没有标点符号。/* ====================================原创 2017-01-12 20:37:03 · 526 阅读 · 0 评论 -
字符个数的统计
char *str = "AbcABca";写出一个函数,查找出每个字符的个数,区分大小写,要求时间复杂度是n(提示用ASCII码)#include #include #define SIZE 256void calCharInString(char* str) { if (str == NULL) { return; } int hash[SIZE] = { 0 };原创 2017-01-12 20:31:14 · 396 阅读 · 0 评论 -
字符串的匹配
在一篇英文文章中查找指定的人名,人名使用二十六个英文字母(可以是大写或小写)、空格以及两个通配符组成(* ?),通配符“*”表示零个或多个任意字母,通配符“?”表示一个任意字母。如:“J* Smi??” 可以匹配“John Smith” .#include #include #define SIZE 100char* search(char* content, char*原创 2017-01-12 20:29:38 · 353 阅读 · 0 评论 -
字符串压缩2
通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。压缩规则:仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc"。压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"。要求实现函数: void原创 2017-01-12 22:08:26 · 610 阅读 · 0 评论 -
集合的差集
已知集合A和B的元素分别用不含头结点的单链表存储,请求集合A与B的差集,并将结果保存在集合A的单链表中。例如,若集合A={5,10,20,15,25,30},集合B={5,15,35,25},完成计算后A={10,20,30}。void saveDifWith2List(LNode** p, LNode** q) { if (!*p && !*q) { return; } if原创 2017-01-12 22:20:48 · 645 阅读 · 0 评论 -
最长公共子串
给定字符串A和B,输出A和B中的第一个最长公共子串,比如A=“wepiabc B=“pabcni”,则输出“abc”。#include using namespace std;#define N 100string findLongestCommonSubString(string str1, string str2) { int dp[N][N] = { 0 }; memset原创 2017-01-12 22:22:36 · 338 阅读 · 0 评论 -
最大重复出现子串
输入一个字符串,如何求最大重复出现的字符串呢?比如输入ttabcftrgabcd,输出结果为abc, canffcancd,输出结果为can。给定一个字符串,求出其最长的重复子串。分析:使用后缀数组,对一个字符串生成相应的后缀数组后,然后再排序,排完序依次检测相邻的两个字符串的开头公共部分。这样的时间复杂度为:生成后缀数组 O(N)排序 O(NlogN*N) 最后面的 N 是因原创 2017-01-13 11:43:22 · 1376 阅读 · 0 评论 -
字符串的移动
字符串为*号和26个字母的任意组合,把 *号都移动到最左侧,把字母移到最右侧并保持相对顺序不变,要求时间和空间复杂度最小。#include #include #define SIZE 100int main(void) { char str[SIZE] = "*hel***lo**wor*ld*"; int len = strlen(str); //找到最后*的下标 int原创 2017-01-13 11:43:03 · 517 阅读 · 0 评论 -
字符串的包含
输入:L:“hello”“july”S:“hellomehellojuly”输出:S中包含的L一个单词,要求这个单词只出现一次,如果有多个出现一次的,输出第一个这样的单词。#include #include #define SIZE 10000char content[SIZE], *pstr[SIZE];int pstrcmp(char* p, char* q) {原创 2017-01-13 11:42:37 · 317 阅读 · 0 评论 -
求链表倒数第n个元素
提示:设置一前一后两个指针,一个指针步长为1,另一个指针步长为n,当一个指针走到链表尾端时, 另一指针指向的元素即为链表倒数第n个元素。#include #include #include "LinkList.h"void createLinkList(LNode **p) { setnull(p); /*建议链表并设置为空表*/ int n = 10, i; srand(t原创 2017-01-13 11:42:18 · 655 阅读 · 0 评论 -
均分01
给定一个字符串,长度不超过100,其中只包含字符0和1,并且字符0和1出现得次数都是偶数。你可以把字符串任意切分,把切分后得字符串任意分给两个人,让两个人得到的0的总个数相等,得到的1的总个数也相等。例如,输入串是010111,我们可以把串切位01, 011,和1,把第1段和第3段放在一起分给一个人,第二段分给另外一个人,这样每个人都得到了1个0和两个1。我们要做的是让切分的次数尽可能少。原创 2017-01-13 11:41:53 · 393 阅读 · 0 评论 -
合法字符串
用n个不同的字符(编号1 - n),组成一个字符串,有如下2点要求:1、对于编号为i 的字符,如果2 * i > n,则该字符可以作为最后一个字符,但如果该字符不是作为最后一个字符的话,则该字符后面可以接任意字符;2、对于编号为i的字符,如果2 * i = 2 * i。问有多少长度为M且符合条件的字符串。例如:N = 2,M = 3。则abb, bab, bbb是符合条件的字符串,原创 2017-01-13 11:40:36 · 1691 阅读 · 0 评论 -
实现memmove函数
分析:memmove函数是的标准函数,其作用是把从source开始的num个字符拷贝到destination。最简单的方法是直接复制,但是由于它们可能存在内存的重叠区,因此可能覆盖了原有数据。比如当source+count>=dest&&source#include #include #include void* memmove(void* dest, void* source,原创 2017-01-12 23:52:28 · 499 阅读 · 0 评论 -
实现memcpy函数
已知memcpy的函数为: void* memcpy(void* dest , const void* src , size_t count)其中dest是目的指针,src是源指针。不调用c++/c的memcpy库函数,请编写memcpy。void* memcpy(void *dst, const void *src, size_t count) { char* result = dst原创 2017-01-12 23:49:58 · 403 阅读 · 0 评论 -
在字符串中删除特定的字符
输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”。提示:采用hash表#define SIZE 256char* deleteCharInString(char *src, char *delStr) { int hash[SIZE] = {原创 2017-01-12 20:27:01 · 491 阅读 · 0 评论 -
找出链表的第一个公共结点
两个单向链表,找出它们的第一个公共结点。思想:采用先后指针unsigned int GetListLength(ListNode* pHead);ListNode* FindFirstCommonNode(ListNode *pHead1, ListNode *pHead2) {// 得到两个链表的长度unsigned int nLength1 = GetListLen原创 2017-01-12 20:25:19 · 294 阅读 · 0 评论 -
在O(1)时间内删除单链表结点
给定单链表的一个结点的指针,同时该结点不是尾结点,此外没有指向其它任何结点的指针,请在O(1)时间内删除该结点。int deleteNode(LNode **head, LNode **node) { if (!head || !node) { return 0; } else if (head == node) { if ((*head)->next) { *head =原创 2017-01-12 20:18:47 · 596 阅读 · 0 评论 -
C链栈实现
#include #include #include"LinkStack.h"const int TRUE = 1;const int FALSE = 0;const int null = 0;void initStack(StackLink *s) { s->top = (StackNode *) malloc(sizeof(StackNode)); s->size = 0;原创 2017-01-12 18:09:36 · 420 阅读 · 0 评论 -
判断一条单向链表是不是“回文”
用到之前的C实现链表http://blog.youkuaiyun.com/edwards_june/article/details/54380468int isPalindrome(LNode *s, int n) { //n是长度 if (0 > n) { return 0; } else { LNode *node = s; int index = n / 2 + (n % 2 =原创 2017-01-12 18:10:51 · 375 阅读 · 0 评论 -
实现string到double的转换
c实现string到double的转换原创 2017-01-12 17:57:26 · 1770 阅读 · 0 评论 -
变位词
c实现变位词查找原创 2017-01-12 17:33:09 · 350 阅读 · 0 评论 -
翻转字符串中的子串
c实现翻转字符串中的子串原创 2017-01-12 17:29:30 · 396 阅读 · 0 评论 -
单词翻转
c实现单词翻转原创 2017-01-12 17:14:37 · 556 阅读 · 0 评论 -
链表翻转
c++实现链表翻转原创 2017-01-12 16:58:58 · 425 阅读 · 0 评论 -
匈牙利算法,求最大匹配数即最小顶点覆盖
#include using namespace std;#define N 10//是否存在连线bool edge[N][N];//配对集,-1表示为配对,其他为配对下标int y[N];//配对元素是否已访问bool visited[N];void init() { memset(edge, false, sizeof(bool) * N * N); edge[0]原创 2017-01-14 12:04:08 · 576 阅读 · 0 评论 -
快排实现
#include #include void swap(int arr[], int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp;}int partition(int arr[], int low, int high) { int temp = arr[low]; int left = low;原创 2017-01-12 18:21:38 · 278 阅读 · 0 评论 -
c实现单链表
c实现单链表原创 2017-01-12 18:25:38 · 339 阅读 · 0 评论 -
最长回文子串
最长回文子串原创 2017-01-12 18:31:00 · 414 阅读 · 0 评论 -
逆序输出链表
输入一个链表的头结点,从尾到头反过来输出每个结点的值。思想:先将元素进栈,再遍历栈内元素int reversePrintList(LNode * pHead) { if (!pHead) { return 0; } StackLink *p = (StackLink*) malloc(sizeof(StackLink)); initStack(p); while (pHea原创 2017-01-12 20:17:46 · 425 阅读 · 0 评论 -
2个链表是否相交
给出俩个单向链表的头指针,比如h1,h2,判断这俩个链表是否相交。为了简化问题,我们假设俩个链表均不带环。问题扩展:如果链表可能有环列?如果需要求出俩个链表相交的第一个节点列?#include #include typedef int Type; /* 字符型数据*/typedef struct LNode { Type data; struct LN原创 2017-01-12 20:14:50 · 259 阅读 · 0 评论 -
对称子字符串的最大长度
输入一个字符串,输出该字符串中对称的子字符串的最大长度。比如输入字符串“google”,由于该字符串里最长的对称子字符串是“goog”,因此输出4。提示:可能很多人都写过判断一个字符串是不是对称的函数,这个题目可以看成是该函数的加强版。int getMaxLenOfPalindrome(char *str, char* newstr) { int mx = 0, id, i = 0, s原创 2017-01-12 20:09:46 · 318 阅读 · 0 评论 -
第一个只出现一次的字符
第一个只出现一次的字符在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。/*O(n) * 次数统计,hash表,ascii为下标,值为出现次数 * char 8bit, hash表长度为2^8=256 * */char firstNotRepeatingChar2(char *str) { if (str == NULL) { retur原创 2017-01-12 20:08:38 · 243 阅读 · 0 评论 -
字母表的特殊排列组合
写一个程序,打印出以下的序列。(a),(b),(c),(d),(e)........(z)(a,b),(a,c),(a,d),(a,e)......(a,z),(b,c),(b,d).....(b,z),(c,d).....(y,z)(a,b,c),(a,b,d)....(a,b,z),(a,c,d)....(x,y,z)。#include #include #define原创 2017-01-12 18:42:13 · 786 阅读 · 0 评论 -
字符串的所有组合
如果不是求字符的所有排列,而是求字符的所有组合,应该怎么办呢? 当输入的字符串中含有相同的字符串时,相同的字符交换位置是不同的排列, 但是同一个组合。举个例子,如果输入abc,它的组合有a、b、c、ab、ac、bc、abc。#include #include #define SIZE 256char str[] = "abcdd";/*二进制求组合*/void pr原创 2017-01-12 18:39:54 · 1201 阅读 · 0 评论