C/C++学习笔记32:字符串操作与字符子串问题
2014-08-27 14:36
369 查看
前面给出了很多关于对于字符、字符串的问题。关于字符串与字符子串的处理问题有很多是可以研究的。之前的总结大致有:字符与字符串的区别、字符与字符串的处理函数、数据结构中的关于串的知识点、数据结构中关于字符串的模式匹配问题,大致上有两个算法:朴素的模式匹配算法和KMP模式匹配的算法。
字符与字符串的区别:/article/9222406.html
字符与字符串处理函数:/article/9222408.html
数据结构与字符串的问题:/article/9222407.html
这里我们用经典的案列来把上面的所有内容再温习一遍:
e.g.1删除字符串中给定的子串
问题描述:在给定的字符串中查找特定子串并删除,如果没有子串则不作任何操作
要求实现函数:
sub_str:需要查找并删除的特定子串
【输出】result_str:在str字符串中删除所有sub_str子字符串后的结果
【返回】删除子字符串的个数
分析:这个问题就是有一个特定的字符串,在特定的字符串中先查找子串的操作,重点在于查找子串。关于查找子串其实就是模式匹配的问题。我们先用数据结构中两种模式匹配算法找到相应的子串位置。再来解决上述问题。
朴素模式匹配算法:
KMP模式匹配算法:
说明:存放子串和主串的数组的首个元素存放字符串的长度。
题型分析:
题型思路,首先用子串去与主串比较,如果不相等,则保留,放在数组reslut_str中。如果相等则继续比较。
当比较完成以后,判断sub_str[i]是否到了结束字符'\0'。如果判断结束了则在进行计数:
字符与字符串的区别:/article/9222406.html
字符与字符串处理函数:/article/9222408.html
数据结构与字符串的问题:/article/9222407.html
这里我们用经典的案列来把上面的所有内容再温习一遍:
e.g.1删除字符串中给定的子串
问题描述:在给定的字符串中查找特定子串并删除,如果没有子串则不作任何操作
要求实现函数:
int delete_sub_str(const char *str,const char sub_str,const *result_str);【输入】str:输入的被操作字符串
sub_str:需要查找并删除的特定子串
【输出】result_str:在str字符串中删除所有sub_str子字符串后的结果
【返回】删除子字符串的个数
分析:这个问题就是有一个特定的字符串,在特定的字符串中先查找子串的操作,重点在于查找子串。关于查找子串其实就是模式匹配的问题。我们先用数据结构中两种模式匹配算法找到相应的子串位置。再来解决上述问题。
朴素模式匹配算法:
#include <stdio.h> #include <string.h> #include "string" int Index(char str[] ,char sub[],int pos) { int i=pos; int j=0; while(i<sizeof(str)-1&&j<sizeof(sub)-1)//用sizeof来计算数组的长度 { if(str[i]==sub[j]) { ++i; ++j; } else { i=i-j+1; //回溯,就是当不匹配的时候,主串返回到开始比对处的下一个位置 j=0; } } if(j>1) return i-2;//返回当前最开始满足的下标值,2是子串的长度。 else return 0; } int main() { char str[]="aadde"; char sub[]="ad"; int pos=1; int m; m=Index(str,sub,0); printf("子串在主串中的位置是:%d\n",m); return 0; }
KMP模式匹配算法:
说明:存放子串和主串的数组的首个元素存放字符串的长度。
#include <stdio.h> #include <string.h> /*获得子串next数组*/ void get_next(char str[],int *next) { int i,j i=1; j=0; next[1]=0; while(i<T[0]) { if(j==0||T[i]=T[j]) { ++i; ++j; next[i]=j; } else { j=next[j]; } } /*返回子串在主串中第pos个字符之后的位置*/ int Index_KMP(char str[],char sub[],int pos) { int i=pos; int j=1; int next[255]; get_next[str,next]; while(i<=str[0]&&j<=sub[0]) { if(j==0||str[i]=sub[j]) { ++i; ++j; } else { j=next[j]; } } if(j>sub[0]) return i-sub[0]; else return 0; } int main() { int str[]={"5aadde"}; int sub[]={"2ad"}; int m=Index_KMP(str,sub,1); printf("子串在主串中的位置是:%d\n",m); return 0; }
题型分析:
题型思路,首先用子串去与主串比较,如果不相等,则保留,放在数组reslut_str中。如果相等则继续比较。
当比较完成以后,判断sub_str[i]是否到了结束字符'\0'。如果判断结束了则在进行计数:
相关文章推荐
- C++学习笔记(字符串string、vector_deque、queue,multiset、map、multimap、容器拷贝问题)
- 《Windows Via C/C++》边学习,边翻译(七)操作字符和字符串-6
- C++学习笔记——erase删除字符串中特定字符 由leetcode383题想到的
- C++学习笔记(八):对字符的操作函数和范围for语句的使用
- 《Windows Via C/C++》边学习,边翻译(四)操作字符和字符串-3
- 《Windows Via C/C++》边学习,边翻译(六)操作字符和字符串-5
- C++学习笔记(字符串string、vector_deque、queue,multiset、map、multimap、容器拷贝问题)(复制粘贴,方便后面翻阅)
- 《Windows Via C/C++》边学习,边翻译(三)操作字符和字符串-2
- PHP学习笔记--字符串操作 作者:yezi33 字符串的整理: trim():除去字符串开头和末尾的空格或其他字符。函数执行成功时返回删除了string字符串首部和尾部空格的字符串,发生错误时返回空
- C/C++学习笔记笔记28:字符与字符串
- 《Windows Via C/C++》边学习,边翻译(五)操作字符和字符串-4
- 《Windows Via C/C++》边学习,边翻译(二)操作字符和字符串-1
- Python学习笔记八:字符串的操作(二)
- C++学习笔记(8)——继承中的二义性问题和虚基类
- C++学习笔记之函数如何返回字符串(char型)
- c++指针学习笔记--交换两个字符串数据
- C++基础教程 学习笔记(二) 数组、字符串和指针
- c++学习笔记-bitset操作
- Python学习笔记二(String字符串操作)
- c++学习笔记2——指向字符串的指针数组?