C/C++学习笔记32:字符串操作与字符子串问题
来源:互联网 发布:网络体系结构的含义 编辑:程序博客网 时间:2024/05/18 03:18
前面给出了很多关于对于字符、字符串的问题。关于字符串与字符子串的处理问题有很多是可以研究的。之前的总结大致有:字符与字符串的区别、字符与字符串的处理函数、数据结构中的关于串的知识点、数据结构中关于字符串的模式匹配问题,大致上有两个算法:朴素的模式匹配算法和KMP模式匹配的算法。
字符与字符串的区别:http://blog.csdn.net/gzbaishabi/article/details/38758675
字符与字符串处理函数:http://blog.csdn.net/gzbaishabi/article/details/38822369
数据结构与字符串的问题:http://blog.csdn.net/gzbaishabi/article/details/38819631
这里我们用经典的案列来把上面的所有内容再温习一遍:
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是子串的长度。elsereturn 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,ji=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];elsereturn 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/C++学习笔记32:字符串操作与字符子串问题
- C/C++学习笔记笔记28:字符与字符串
- 【C语言】学习笔记:字符串与字符数组
- c字符与字符串
- C语言字符串操作--删除子串
- C语言字符串操作--删除子串
- C指针操作——全部替换字符串里某个字符或者某个子串
- C语言学习笔记:19_数组-字符数组与字符串(常用字符串函数)
- c字符和字符串操作
- 字符/字符串操作函数(C)
- C/C++学习笔记五(结构体、字符与字符串)
- 字符与字符串操作——Windows via C/C++
- 求字符串的最长无重复字符子串(C++)
- c字符-字符串问题集锦
- C/C++学习笔记:指针与字符串
- C字符数组与字符串
- C学习笔记--在字符串中删除指定的字符
- c语言中,字符数组与字符串赋值问题
- 雷德算法 (快速傅里叶变换中用到的倒位序算法)
- 数据库ORA-01196(ORA-10458/ORA-01110)错误解决方法
- 使用notification广播实现视图跳转传递数据
- LeetCode Add Two Numbers
- Java初学习-泛型初学习
- C/C++学习笔记32:字符串操作与字符子串问题
- Windows进程间各种通信方式浅谈
- Groovy入门教程
- java使用Apache POI操作excel文件
- 错误:expected unqualified-id before ‘template’
- jsp中禁止页面缓存
- Jquery 动态绑定事件 live
- Android AIDL——实现机制浅析
- js获取iframe和父级之间元素,方法、属,获取iframe的高度自适应iframe高度