北京化工大学数据结构2022/10/13作业 题解

2023-11-10 13:10

本文主要是介绍北京化工大学数据结构2022/10/13作业 题解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

问题 A: 字符串变换

问题 B: 字符串求反

问题 C: 字符串转化为整数(附加代码模式)

问题 D: 字符串匹配(朴素算法)-附加代码模式

问题 E: 求解最长首尾公共子串-附加代码模式

问题 F: 算法4-7:KMP算法中的模式串移动数组-附加代码模式

问题 G: 数据结构作业03 -- 改进的nextVal向量

问题 H: 算法4-6:字符串匹配算法执行次数比较(朴素、KMP、改进的KMP)-附加代码模式


问题 A: 字符串变换

依据题意,只可以在末尾增加或删除

所以如果ab串长度不相等,要先用|m-n|步将两字符串补齐

当然,补的那部分天然相等

所以在改这步中,我们只需要比较m,n短的那个,每个不同加一步即可

signed main(){int m,n;cin>>m>>n;string a,b;cin>>a>>b;int t=0;t+=fabs(m-n);for(int i=0;i<min(m,n);i++)if(a[i]!=b[i])t++;cout<<t;return 0;
}

问题 B: 字符串求反

这。。。。应该没啥好说的

signed main(){string a;cin>>a;reverse(a.begin(),a.end());cout<<a.size()<<'\n'<<a;
}

问题 C: 字符串转化为整数(附加代码模式)

从后往前遍历即可

k代表当前这个数后面有几个0

int str2int(const char a[],int &data){int m=strlen(a);data=0; int k=1;for(int i=m-1;i>=0;i--){if(a[i]>='0'&& a[i]<='9'){int now=(a[i]-'0')*k;data+=now;k=k*10;}else{return 1;}}return 0;   
}

问题 D: 字符串匹配(朴素算法)-附加代码模式

朴素算法,每一位匹配一遍即可,匹配成功就返回当前位置

代码如下

#define max 1000000
int findPos(char s[], char t[]){int m=strlen(s);int n=strlen(t);if(m<n){return -1;}for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(s[i+j]!=t[j]){break;}if(j==n-1){return i;}}}return -1;
}

问题 E: 求解最长首尾公共子串-附加代码模式

最长首位公共子串是什么?

首先前缀子串和后缀子串大家应该都不陌生

比如abacab这个串

a,ab,aba,abac,abaca这叫前缀

b,ab,cab,acab,bacab这叫后缀

最长首位公共子串就是在等于前缀的后缀中最长的那个

很显然是ab

 那么如何求这个最长首尾公共子串呢

我们只需要两个指针,j去找匹配的后缀

k与j比对找与之匹配的前缀

如果j,k相等,那么j,k都往后走一步

如果j走到了末尾,那么很显然此时k就是答案

如果还没走到末尾就断了,那么k就要退回到ne[k]

代码如下

int ne[100000];
#define max 1000000
int calcLCT(char t[]){int n=strlen(t);if(n==1){return -1;}ne[0]=-1;int k=ne[0];int j=0;while(j<n){if(k==-1||t[j]==t[k]){j++;k++;ne[j]=k;}else{k=ne[k];}}return ne[n];
}

问题 F: 算法4-7:KMP算法中的模式串移动数组-附加代码模式

算法同上

毕竟next数组的本质就是当前匹配到的最长前后公共子串

#define max 1000000
void getNext(char t[], int ne[]){int k=-1;ne[0]=-1;int len=strlen(t);int j=0;while (j<len-1){if (k==-1||t[k]==t[j]){k++;j++;ne[j]=k;}else{k = ne[k];}}
}

问题 G: 数据结构作业03 -- 改进的nextVal向量

原next数组的问题:

 也就是说,如果按原next回溯,回溯到的值与目前的值一样,那不白回溯了吗

原来就是因为C和B不相等才回溯的,你回溯完之后还是B,那不照样不相等吗

所以我们就要预处理一下nextval,如果回溯的值相等,那我们就要再往深层回溯

直至回溯之后与当前不相等

nextval与原next的关系:

如果位置k的元素与next[k]元素相同时,nextval[k]=nextval[next[k]]

如果位置k的元素与next[k]元素不同时,nextval[k]= next[k]

代码如下: 

using namespace std;
void CalcNextVal(char p[],int ne[])
{int i=0;int j=-1;ne[i]=j;int len=strlen(p);while(i<len){if(j==-1||p[i]==p[j]){i++;j++;if(p[i]==p[j]){ne[i]=ne[j];}else{ne[i]=j;}}else{j=ne[j];}}
}
char s[1000000];
int ne[1000000];
signed main()
{while(cin>>s){CalcNextVal(s,ne);int len2=strlen(s);fer(i,0,len2-1){cout<<ne[i]<<" ";}cout<<'\n';}
}

问题 H: 算法4-6:字符串匹配算法执行次数比较(朴素、KMP、改进的KMP)-附加代码模式

这题基本是以上代码的结合体

又是一道码农题

代码如下:

#include<bits/stdc++.h>
using namespace std;
#define max 1000000
#define fer(i,a,b) for(int i=a;i<=b;++i)
#define der(i,a,b) for(int i=a;i>=b;--i)
int findPos(char S[], char T[]){int res=0;int lens=strlen(S);int lent=strlen(T);int i=0,j=0;while(i<lens&&j<lent){res++;if(S[i]==T[j]){i++;j++;}else{i-=j-1;j=0;}}cout<<"count in findPos is:"<<res<<endl;if(j>=lent){return i-j;}else{return -1;}
}
void CalcNext(char T[],int ne[]){int i=0,k=-1;ne[0]=-1;while(i<strlen(T)) {if (k==-1||T[i]==T[k]) {i++;k++;ne[i]=k;}else{k=ne[k];}}
}
void CalcNextVal(char T[],int ne[],int neVal[]){int l=strlen(T);fer(i,0,l-1){neVal[i]=ne[i];}fer(i,0,l-1){int k=ne[i];if(T[i]==T[k]){neVal[i]=neVal[k];}}
}
int findPos_kmp(char S[], char T[], int ne[]){int res=0;int lens=strlen(S);int lent=strlen(T);int i=0,j=0;while(i<lens&&j<lent){res++;if(S[i]==T[j]||j==-1){i++;j++;}else{j=ne[j];}}cout<<"count in findPos_kmp is:"<<res<<endl;if(j>=lent){return i-lent;}else{return -1;}
}

这篇关于北京化工大学数据结构2022/10/13作业 题解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/382824

相关文章

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘

Go语言中三种容器类型的数据结构详解

《Go语言中三种容器类型的数据结构详解》在Go语言中,有三种主要的容器类型用于存储和操作集合数据:本文主要介绍三者的使用与区别,感兴趣的小伙伴可以跟随小编一起学习一下... 目录基本概念1. 数组(Array)2. 切片(Slice)3. 映射(Map)对比总结注意事项基本概念在 Go 语言中,有三种主要

作业提交过程之HDFSMapReduce

作业提交全过程详解 (1)作业提交 第1步:Client调用job.waitForCompletion方法,向整个集群提交MapReduce作业。 第2步:Client向RM申请一个作业id。 第3步:RM给Client返回该job资源的提交路径和作业id。 第4步:Client提交jar包、切片信息和配置文件到指定的资源提交路径。 第5步:Client提交完资源后,向RM申请运行MrAp

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

《数据结构(C语言版)第二版》第八章-排序(8.3-交换排序、8.4-选择排序)

8.3 交换排序 8.3.1 冒泡排序 【算法特点】 (1) 稳定排序。 (2) 可用于链式存储结构。 (3) 移动记录次数较多,算法平均时间性能比直接插入排序差。当初始记录无序,n较大时, 此算法不宜采用。 #include <stdio.h>#include <stdlib.h>#define MAXSIZE 26typedef int KeyType;typedef char In

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

C - Word Ladder题解

C - Word Ladder 题解 解题思路: 先输入两个字符串S 和t 然后在S和T中寻找有多少个字符不同的个数(也就是需要变换多少次) 开始替换时: tips: 字符串下标以0开始 我们定义两个变量a和b,用于记录当前遍历到的字符 首先是判断:如果这时a已经==b了,那么就跳过,不用管; 如果a大于b的话:那么我们就让s中的第i项替换成b,接着就直接输出S就行了。 这样