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'。如果判断结束了则在进行计数:

0 0
原创粉丝点击