数据结构 第四章学习小结

在第四章的学习中,主要学习了串和数组,相对于上学期学习过的数组,串的内容相对比较难,在关于串的应用方面也遇到了一些问题。

给定一个主串S(长度<=10^6)和一个模式T(长度<=10^5),要求在主串S中找出与模式T相匹配的子串,返回相匹配的子串中的第一个字符在主串S中出现的位置。

先上题目

输入格式:

输入有两行: 第一行是主串S; 第二行是模式T.

输出格式:

输出相匹配的子串中的第一个字符在主串S中出现的位置。若匹配失败,输出0.

输入样例:

在这里给出一组输入。例如:

aaaaaba
ba

输出样例:

在这里给出相应的输出。例如:

6

在做这道题的时候开始一直不懂next数组(虽然现在也不是很懂QAQ),尝试着按照书本上的方式去做,也在网站上查阅了一些资料,最后做出这道题如下:
#include <iostream>
#include <string.h>
using namespace std;
void get_next(string s,int next[])
{
 int length = s.length(); //求出字串的长度
 
 int i = 0,j = -1;
 
 next[0] = -1;
 
 while(i<length)
 {
  if (j==-1 || s[i]==s[j])next[++i] = ++j;
  else j = next[j];
 }
 //根据字串求出next数组
}
int get_position(string a,string b)
{
 int i=0 , j=0; //主串和字串都从第一个字符开始比较
 
 int next[ b.length() ]; //为next数组创建空间
 
 get_next(b,next); //得到next数组
 
 while( i<a.length()  && j<b.length()  ) //两个串均未比较到末尾
 {
  if(j==-1 || a[i]==b[j] ) //继续比较后续字符
  {
   i++;
   j++;
  }
  else j=next[j]; //模式串向右移动
 }
 
 if( j==b.length()  )
  return i-j+1  ; //匹配成功,返回位置
 else
  return 0; //匹配失败
}
 
int main()
{
 string a,b; //分别定义主串和字串
 cin >> a >> b; //分别输入主串和字串
 
 cout<<get_position(a,b); //得到匹配的位置
 
 return 0;
}
但是匹配一直失败,自己也找不出问题,最后试着每个代码都改一改才发现是while( i<a.length()  && j<b.length()这方面出问题,最后上百度查阅了下发现之前有类似问题存在,网址:https://blog.csdn.net/lucasdove/article/details/50904725
解决方法:在前面先设定两个int型参数 alen 和 blen,分别等于a.length() 和 b.length(),原因是string函数里的length函数返回的是无符号数,在作为判断条件时会出现问题。
 
附上正确代码:
#include <iostream>
#include <string.h>
using namespace std;
void get_next(string s,int next[])
{
 int length = s.length(); //求出字串的长度
 
 int i = 0,j = -1;
 
 next[0] = -1;
 
 while(i<length)
 {
  if (j==-1 || s[i]==s[j])
  {
   next[++i] = ++j;
  }
  else
  {
   j = next[j];
  }
 }
 //根据字串求出next数组
}
int get_position(string a,string b)
{
 int i=0 , j=0; //主串和字串都从第一个字符开始比较
 
 int alen=a.length() ;//求出a串长度
 int blen=b.length() ;//求出b串长度
 
 int next[blen]; //为next数组创建空间
 
 get_next(b,next); //得到next数组
 
 while( i<alen && j<blen ) //两个串均未比较到末尾
 {
  if(j==-1 || a[i]==b[j] ) //继续比较后续字符
  {
   i++;
   j++;
  }
  else j=next[j]; //模式串向右移动
 }
 
 if( j==blen )
  return i-j+1  ; //匹配成功,返回位置
 else
  return 0; //匹配失败
}
 
int main()
{
 string a,b; //分别定义主串和字串
 cin >> a >> b; //分别输入主串和字串
 
 cout<<get_position(a,b); //得到匹配的位置
 
 return 0;
}

猜你喜欢

转载自www.cnblogs.com/xiedehan/p/10706693.html