首页 字符串专题

字符串专题

举报
开通vip

字符串专题1. 题目:输入一个字符串,要求找出字符串中最大子串的长度(如字符串abcd13agbf,当重复出现某个字符时,算一个子串,比如abcd13a或bcd13agb都是子串)。 理解:要是每个字符都不一样,则最大子串长度为0 思想:用空间换取时间,用一个数组lastPos[256]代表着256个可能的字符(ASC2码),而数组的值代表字符串中这个字符的最后出现位置,初始数组元素都为负数,然后每次取字符串中的一个字符,此字符的ASC2码为c,若lastPos[c]=0,则表示此字符已经出现过,则可以计算这个子串的长度,...

字符串专题
1. 题目:输入一个字符串,要求找出字符串中最大子串的长度(如字符串abcd13agbf,当重复出现某个字符时,算一个子串,比如abcd13a或bcd13agb都是子串)。 理解:要是每个字符都不一样,则最大子串长度为0 思想:用空间换取时间,用一个数组lastPos[256]代表着256个可能的字符(ASC2码),而数组的值代表字符串中这个字符的最后出现位置,初始数组元素都为负数,然后每次取字符串中的一个字符,此字符的ASC2码为c,若lastPos[c]<0,则表示此字符第一次出现,置lastPos[c]为此字符在字符串中的位置,若lastPos[c]>=0,则表示此字符已经出现过,则可以计算这个子串的长度,若比之前的最大子串长,则更新最大子串长度。 分析:时间复杂度为o(n) int GetMaxSubStr(const unsigned char *str) { int maxLen = 0; if (NULL == str) return 0; int lastPos[256]; //代表着256个可能的字符(ASC2码),数组元素值代表字符串中字符的最后出现的位置 for (int i = 0; i < 256; ++i) lastPos[i] = -1; for (int pos = 0; str[pos] != '\0'; ++pos) { unsigned char c = str[pos]; if (lastPos[c] > -1) //此字符已经出现过 { int len = pos - lastPos[c] + 1; //计算子串的长度 if (len > maxLen) maxLen = len; } lastPos[c] = pos; } return maxLen; } 2. 找出两个字符串中的最长相同子串 算法的思想:利用二维数组建立两个字串之间的“对应矩阵”,然后初始化矩阵(mat[i][j]置1或0),然后根据矩阵的对角线找出连续出现1的最长段,及在串中的起始位置。 3. 在一个字符串中查找可能的最长子串,该子串由相同字符组成 #include  #include  void find(char* str, char*& start, int& length) { char* p = str; char* q; int len = 0; length=0; while(*p) { q = p+1; while(*q && *q == *p) q++; len = q - p; if(len>length) { length = len; start = p; } p=q; } } int main() { char str[1024]; scanf("%s", str); char* p; int len; find(str,p, len); p[len]=0; printf("%s\n", p); return 0; } 4. 给定一个字符串,要求找出重复出现且最长的子串 5. Memcpy和memmove . 1)当 src 和 dest 所指内存区有重叠时,memmove 相对 memcpy 能提供保证:保证能将 src 所指内存区的前 n 个字节正确的拷贝到 dest 所指内存中; 2). 当 src 地址比 dest 地址低时,两者结果一样。换句话说,memmove 与 memcpy 的区别仅仅体现在 dest 的头部和 src 的尾部有重叠的情况下; memcpy 代码:        void* memcpy(void* dest, void* source, size_t count)       {            void* ret = dest;           //copy from lower address to higher address           while (count--)                   *dest++ = *source;            return ret;       } memmove     void* memmove(void* dest, void* source, size_t count)    {        void* ret = dest;        if (dest <= source || dest >= (source + count))        {           //Non-Overlapping Buffers          //copy from lower addresses to higher addresses          while (count --)                *dest++ = *source++;      }      else      {         //Overlapping Buffers        //copy from higher addresses to lower addresses        dest += count - 1;        source += count - 1;        while (count--)                 *dest-- = *source--;l       }       return ret;    }
本文档为【字符串专题】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_500614
暂无简介~
格式:doc
大小:39KB
软件:Word
页数:0
分类:互联网
上传时间:2012-03-05
浏览量:18