DS第4章学习小结
Posted ymj19
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DS第4章学习小结相关的知识,希望对你有一定的参考价值。
- 你对本章内容的小结
- 完成作业或实践时解决困难的经验分享
- 这段时间,你参考了哪些值得向大家分享的资料?每一项推荐都请说明推荐理由及列出相关链接(或书目名称,具体页码)
- 目前学习过程中存在的困难,待解决或待改进的问题
- 上次博客确定的目标达到了吗?如果没达到,请分析原因
- 接下来的目标
一、你对本章内容的小结
第4章主要学习了串、数组
串主要学习了有关 模式匹配算法 的两种算法:T(n)=O(m*n)的BF算法 和 T(n)=O(m+n)的KMP算法,
KMP算法难在求出 模式的next数组。(即求next数组时的思想)
数组主要学习了 怎么求具体下标的元素的地址 以及 如何用一维数组将一些特殊矩阵(如对称矩阵、三角矩阵、对角矩阵、稀疏矩阵等)进行压缩存储。
二、完成作业或实践时解决困难的经验分享
先上修正前的代码:
1 #include<iostream> 2 using namespace std; 3 4 5 void getnext(string t, int *next); 6 int match(string S, string T, const int *next); 7 8 9 int main()//7-1 串的模式匹配 10 { 11 // freopen("input.txt","r",stdin); 12 // freopen("output.txt","w",stdout); 13 14 15 string S; 16 string T; 17 cin>>S; 18 cin>>T; 19 20 21 int next[T.length()]; 22 getnext(T,next); 23 24 25 cout<<match(S,T,next); 26 27 28 return 0; 29 } 30 31 32 33 34 void getnext(string t, int *next) 35 { 36 next[0]=-1; 37 for(int i=0,j=-1; i<t.length();) 38 { 39 if(j==-1||t[i]==t[j]) 40 { 41 i++;j++; 42 next[i]=j; 43 } 44 else j=next[j]; 45 } 46 } 47 48 49 int match(string S, string T, const int *next) 50 { 51 int i=0,j=0; 52 for(;i<S.length()&&j<T.length();) 53 { 54 if(j==-1||S[i]==T[j]) 55 { 56 i++;j++; 57 } 58 else 59 { 60 j=next[j]; 61 } 62 } 63 if(j==T.length()) return i-T.length()+1; 64 else return 0; 65 }
这是我最开始做PTA第4章作业的串的模式匹配的时候用KMP算法写的代码,
这是个有点错的代码。
修正后的代码:
1 #include<iostream> 2 using namespace std; 3 4 5 void getnext(string t, int *next); 6 int match(string S, string T, const int *next); 7 8 9 int main()//7-1 串的模式匹配 10 { 11 // freopen("input.txt","r",stdin); 12 // freopen("output.txt","w",stdout); 13 14 15 string S; 16 string T; 17 cin>>S; 18 cin>>T; 19 20 21 int next[T.length()]; 22 getnext(T,next); 23 24 25 cout<<match(S,T,next); 26 27 28 return 0; 29 } 30 31 32 33 34 void getnext(string t, int *next) 35 { 36 next[0]=-1; 37 for(int i=0,j=-1; i<(int)t.length();) 38 { 39 if(j==-1||t[i]==t[j]) 40 { 41 i++;j++; 42 next[i]=j; 43 } 44 else j=next[j]; 45 } 46 } 47 48 49 int match(string S, string T, const int *next) 50 { 51 int i=0,j=0; 52 for(;i<(int)S.length()&&j<(int)T.length();) 53 { 54 if(j==-1||S[i]==T[j]) 55 { 56 i++;j++; 57 } 58 else 59 { 60 j=next[j]; 61 } 62 } 63 if(j==(int)T.length()) return i-T.length()+1; 64 else return 0; 65 }
这是我修改过后的代码,可以看到我只是在 字符串的长度 前加了(int)进行类型转换,简单来说,就是
负数 不能与 字符数组的strlen(s) 以及 字符串的s.length 进行比较,
或者说 有符号整型中的负数 不能与 无符号整型 进行比较。
1 #include<iostream> 2 #include<string.h> 3 using namespace std; 4 5 6 const int MAXSIZE=1002; 7 8 9 void change2(char *ch);//空格 10 void change3(char *ch);//大写变小写 11 void change4_6(char *ch);//I和me变成you以及can you变成I can 12 void change5(char *ch);//?变成! 13 bool punctuation(char ch);//判断标点符号 14 15 16 int main()//7-2 AI核心代码 17 { 18 // freopen("input.txt","r",stdin); 19 // freopen("output.txt","w",stdout); 20 int n=0; 21 cin>>n; 22 cin.ignore(10,‘ ‘); 23 24 25 char a[n][4*MAXSIZE]; 26 27 28 for(int i=0; i<n; i++) 29 { 30 cin.getline(a[i],MAXSIZE); 31 } 32 33 34 for(int i=0; i<n; i++) 35 { 36 cout<<a[i]<<endl; 37 cout<<"AI: "; 38 39 40 change2(a[i]); 41 change3(a[i]); 42 change4_6(a[i]); 43 change5(a[i]); 44 45 46 cout<<a[i]; 47 48 49 if(i!=n-1) 50 cout<<endl; 51 } 52 53 54 return 0; 55 } 56 57 58 59 60 void change2(char *ch)//空格 61 { 62 int k=0; 63 for(int i=0; ch[i]!=‘