您的位置:首页 > 编程语言 > C语言/C++

C/C++学习笔记32:字符串操作与字符子串问题

2014-08-27 14:36 369 查看
前面给出了很多关于对于字符、字符串的问题。关于字符串与字符子串的处理问题有很多是可以研究的。之前的总结大致有:字符与字符串的区别、字符与字符串的处理函数、数据结构中的关于串的知识点、数据结构中关于字符串的模式匹配问题,大致上有两个算法:朴素的模式匹配算法和KMP模式匹配的算法。

字符与字符串的区别:/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'。如果判断结束了则在进行计数:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐