m0_63737058 2022-11-23 19:49 采纳率: 100%
浏览 6
已结题

实现字符串的数组存储报告

用c++
1实现字符串的数组存储。

2实现串的朴素的匹配算法,找出子串位置

3编写改进型的串的匹配算法,指出改进在何处,时间复杂度和空间复杂度各是多少。

4叙述该部分每个板块需求

5在此说明每个部分的算法设计说明( 可以是描述算法的流程图),每个程序中使用的存储结构设计说明(如果指定存储结构请写出该存储结构的定义,如果用面向对象的方法,应该给出类中成员变量和成员函数原型声明)
6调试过程中的问题解决方式和改进设想

afsdasfda主串
das 子串

  • 写回答

1条回答 默认 最新

  • ...404 Not Found 2022-11-24 09:33
    关注
    
    二、需求分析(格式:宋体,4号,加粗,两端对齐)
    实现子串匹配
    在该部分中叙述每个模块的功能要求
    (正文格式:宋体,小4号,不加粗,两端对齐,1.5倍行距)
    BF暴力匹配,KMP算法分为求next数组模块与子串匹配模块
    三、概要设计(格式:宋体,4号,加粗,两端对齐)
    在此说明每个部分的算法设计说明(可以是描述算法的流程图),每个程序中使用的存储结构设计说明(如果指定存储结构请写出该存储结构的定义,如果用面向对象的方法,应该给出类中成员变量和成员函数原型声明)。
    (正文格式:宋体,小4号,不加粗,两端对齐,1.5倍行距)
    算法使用回溯+双指针,BF算法不开辟额外数组存储,KMP算法要开辟一块与模式串等长的next数组记录回溯下标
    
    四、详细设计(格式:宋体,4号,加粗,两端对齐)
    各个算法实现的源程序(可以是一组源程序,每个功能模块采用不同的函数实现),源程序要按照写程序的规则来编写。要结构清晰,重点函数的重点变量,重点功能部分要加上清晰的程序注释。
    (正文格式:宋体,小4号,不加粗,两端对齐,1.5倍行距)
    #include<iostream>
    #include<string>
    #include<vector>
    using namespace std;
    int BF(string s, string t)//朴素算法,时间复杂度O(m-n+1)*n,空间复杂度O(1),未使用额外数组空间
    {
     int i = 0, j = 0;
     while (s[i] && t[j])//字符串都没走到'\0'
     {
      if (s[i] == t[j])//相等向后匹配
      {
       i++;
       j++;
      }
      else
      {
       i = i - j + 1;//回退
       j = 0;
      }
     }
     if (t[j])//如果匹配串还未走完,则无匹配子串
      return -1;
     else
      return i - j;
    }
    
    
    //改进,Kmp算法
    vector<int>getnext(string t)//获取next数组
    {
     int len = t.size();
     vector<int>next(len, 0);
     for (int i = 1, j = 0; i < len; i++)
     {
      while (j > 0 && t[i] != t[j])
       j = next[j - 1];//不匹配,模式串指针通过next数组回退
      if (t[i] == t[j])//相等,指针后移
       j++;
      next[i] = j;//记录回退位置
     }
     return next;
    }
    int KMP(string s, string t, vector<int>next)//KMP,时间复杂度O(m+n),空间复杂度O(n)
    {
     int lens = s.size(), lent = t.size();
     for (int i = 0, j = 0; i < lens; i++)
     {
      while (j > 0 && s[i] != t[j])
       j = next[j - 1];//不相等回退
      if (s[i] == t[j])
       j++;
      if (j == lent)//当模式串达到末尾时匹配成功
       return i - lent + 1;
     }
     return -1;
    }
    int main()
    {
     string s = "afsdasfda", t = "das";
     cout << BF(s, t) << endl << KMP(s, t, getnext(t));
     return 0;
    }
    五、测试数据及其结果分析(格式:宋体,4号,加粗,两端对齐)
    (正文格式:宋体,小4号,不加粗,两端对齐,1.5倍行距)
    正确无误
    六、调试过程中的问题(格式:宋体,4号,加粗,两端对齐)
    每个模块设计和调试时存在问题的思考(问题是哪些?问题如何解决?),以及算法的改进设想。
    尽可能降低时间复杂度,拿空间换时间,多观察数据之间的规律
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 11月24日
  • 已采纳回答 11月24日
  • 赞助了问题酬金15元 11月23日
  • 创建了问题 11月23日

悬赏问题

  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)