写一个在一个字符串(n)中寻找一个子串(m)第一个位置的函数
来源:互联网 发布:阳光网络伴我成长绘画 编辑:程序博客网 时间:2024/04/20 22:57
//==========================================================================
//程序功能:写一个在一个字符串(n)中寻找一个子串(m)第一个位置的函数
//程序实现思路:kmp算法,BM算法(不实现,但是会贴出基本思路)
//程序设计语言:c++
//
//===========================================================================
#include<iostream>
using namespace std ;
int find_firststr(const char* str,const char* first_str)
{
int res = -1 ;
//对输入的数据进行检查
int sLen = strlen(str) ;//查看strlen内部构造方式,方便这个地方进行差错检查
int fLen = strlen(first_str);
if( sLen==0 || fLen==0 || sLen<fLen )
{
cout<<" insert string error"<<endl;
return -1 ;
}
//进行查找
//kmp算法:定义一个辅助数组,记录比较字符串的真前缀(具体概念名词忘了)1 构造数组,
//2:查找,当发现不匹配时根据辅助数组跳转相应的位数(最大真前缀的位置)
int i = 0 ;
int j = -1 ;
int next[256] ;//其实next的大小只需要和模式串的大小一致就好了,但是这里无法获取常量的大小,所以只能定义一个最大值了
next[0] = -1 ;
while( j < fLen)//构造next数组
{//将next、模式串放在一起,没走动一个i,那么必须给next赋值,
if( j == -1 || first_str[i] == first_str[j] )//如果这两个值相等,那么next值等于前面一个next的值(此时任为j)加1
{
i++ ;
if( i >= fLen)
break ;
j++ ;
next[i] = j ;
}
else //如果这两个值不相等,那么就跳到前面最近的相等的地方,在重复比较这两个值,如果一直都不想等,那么就会置-1
{
j = next[j] ;
}
}
i = 0 ;
j = 0 ;
while(j < fLen && i < sLen)
{
if(j==-1 || str[i] == first_str[j] )
{
i++ ;
j++ ;
}
else
{
j = next[j] ;
}
}
if(j<fLen) //表明此时没有匹配的字符串
return 0 ;
//BM算法(现在不实现了,以后有机会在弄):
//这是在kmp算法的基础上面改进的,它有两个辅助数组,坏字符辅助数组,好后缀辅助数组,这时候将模式串和源串第一个字符对齐,
//并从模式串的最后一个字符开始比较,如果直接发现不匹配,寻找坏字符辅助数组中跟坏字符相等的最右边的一个位置,并移动模式串
//如果模式串在当前位置已经匹配了一个子字符串,此时才出现不匹配现象,那么通过好后缀辅助数组进行移动模式串
return i - j + 1 ;
}
int main()
{
int res = 0 ;
//测试用例
char* str = "abcdefgfgfhabfsgegysufgdscdvdsfgfhuilads";
char* first_str1 = "gfhu";//唯一的子串
char* first_str2 = "fgfh";//有两个的子串
char* first_str3 = "duf" ;//没有子串
cout<<find_firststr(str,first_str1)<<endl;
cout<<find_firststr(str,first_str2)<<endl;
cout<<find_firststr(str,first_str3)<<endl;
system("pause");
return res ;
}
//程序功能:写一个在一个字符串(n)中寻找一个子串(m)第一个位置的函数
//程序实现思路:kmp算法,BM算法(不实现,但是会贴出基本思路)
//程序设计语言:c++
//
//===========================================================================
#include<iostream>
using namespace std ;
int find_firststr(const char* str,const char* first_str)
{
int res = -1 ;
//对输入的数据进行检查
int sLen = strlen(str) ;//查看strlen内部构造方式,方便这个地方进行差错检查
int fLen = strlen(first_str);
if( sLen==0 || fLen==0 || sLen<fLen )
{
cout<<" insert string error"<<endl;
return -1 ;
}
//进行查找
//kmp算法:定义一个辅助数组,记录比较字符串的真前缀(具体概念名词忘了)1 构造数组,
//2:查找,当发现不匹配时根据辅助数组跳转相应的位数(最大真前缀的位置)
int i = 0 ;
int j = -1 ;
int next[256] ;//其实next的大小只需要和模式串的大小一致就好了,但是这里无法获取常量的大小,所以只能定义一个最大值了
next[0] = -1 ;
while( j < fLen)//构造next数组
{//将next、模式串放在一起,没走动一个i,那么必须给next赋值,
if( j == -1 || first_str[i] == first_str[j] )//如果这两个值相等,那么next值等于前面一个next的值(此时任为j)加1
{
i++ ;
if( i >= fLen)
break ;
j++ ;
next[i] = j ;
}
else //如果这两个值不相等,那么就跳到前面最近的相等的地方,在重复比较这两个值,如果一直都不想等,那么就会置-1
{
j = next[j] ;
}
}
i = 0 ;
j = 0 ;
while(j < fLen && i < sLen)
{
if(j==-1 || str[i] == first_str[j] )
{
i++ ;
j++ ;
}
else
{
j = next[j] ;
}
}
if(j<fLen) //表明此时没有匹配的字符串
return 0 ;
//BM算法(现在不实现了,以后有机会在弄):
//这是在kmp算法的基础上面改进的,它有两个辅助数组,坏字符辅助数组,好后缀辅助数组,这时候将模式串和源串第一个字符对齐,
//并从模式串的最后一个字符开始比较,如果直接发现不匹配,寻找坏字符辅助数组中跟坏字符相等的最右边的一个位置,并移动模式串
//如果模式串在当前位置已经匹配了一个子字符串,此时才出现不匹配现象,那么通过好后缀辅助数组进行移动模式串
return i - j + 1 ;
}
int main()
{
int res = 0 ;
//测试用例
char* str = "abcdefgfgfhabfsgegysufgdscdvdsfgfhuilads";
char* first_str1 = "gfhu";//唯一的子串
char* first_str2 = "fgfh";//有两个的子串
char* first_str3 = "duf" ;//没有子串
cout<<find_firststr(str,first_str1)<<endl;
cout<<find_firststr(str,first_str2)<<endl;
cout<<find_firststr(str,first_str3)<<endl;
system("pause");
return res ;
}
0 0
- 写一个在一个字符串(n)中寻找一个子串(m)第一个位置的函数
- 写一个在一个字符串(n)中寻找一个子串(m)第一个位置的函数
- 写一个在一个字符串(n)中寻找一个子串(m)第一个位置的函数
- 写一个在一个字符串(n)中寻找一个子串(m)第一个位置的函数
- C++面试题之写一个在一个字符串中寻找一个子串第一个位置的函数
- 4.写一个控制台应用程序,接收一个长度大于3的字符串,完成下列功能: 1)输出字符串的长度。 2)输出字符串中第一个出现字母a的位置。 3)在字符串的第3个字符后面插入子串“hello”,输出新字符串。 4)将字符串“hello”替换为“me”,输出
- C++实现在一个字符串中寻找最大子串
- C语言:有一个字符串,包含n个字符。写一个函数,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串
- 寻找一个字符串中最长的重复子串
- 寻找一个字符串中最长的重复子串
- 算法4.1 在一个字符串寻找子串,并返回位置
- 寻找字符串s中第一个最长的重复子串及其位置
- 查找一个在另一个字符串出现在另一个字符串的第一个位置
- 从一个字符串中删除其包含的某个(第一个)子串
- C# 找出一个子串在另一字符串中出现的所有位置
- 获得子串在一个字符串中首次出现的位置
- 编写一个函数,它的返回值是主串中第一个字符子串的位置以后的所有字符
- 寻找一个字符串中第一个只出现两次的字符
- Android 常用方法使用注意
- iOS开发之第三方移动支付平台
- 只转不评:112家IT公司薪水一览表
- 积跬步至千里——算法强化训练(3)数组装水
- NYOJ_33 蛇形填数(蛇形矩阵)
- 写一个在一个字符串(n)中寻找一个子串(m)第一个位置的函数
- 永存、曲折、已死、重生——传奇的java
- cookie、session以及Servlet的一些注意细节
- 不一样的心情重新出发
- MATLAB MCode 使用
- Windows无法安装到GPT分区形式磁盘,怎么办?
- cocoapod损坏修复方法
- 关于HTML5的一些属性
- 背包方案及变形