实验内容
1.一个文本串可用事先给定的字母映射表进行加密。例如,设字母映射表为:
a b c d e f g h i j k l m n o p q r s t u v w x y z
n g z q t c o b m u h e l k p d a w x f y i v r s j
则字符串“encrypt”被加密为“tkzwsdf”。编写一个程序exp4-4.cpp,将输出的文本串加密后输出,然后进行解密并输出。
2.采用顺序结构存储串,编写一个程序exp4-5.cpp,利用简单模式匹配方法求串s中出现的第一个最长重复字符串的下标和长度。
代码实现
1、
exp4-4.cpp
#include <iostream>
#include <string.h>
#define MaxSize 100
using namespace std;
typedef struct
{
char data[MaxSize];
int length;
} SqString;
SqString A,B;
void StrAssign(SqString &s,char cstr[])
{
int i;
for(i=0; cstr[i]!='\0'; i++)
{
s.data[i]=cstr[i];
}
s.length=i;
}
void DispStr(SqString s)
{
int i;
if(s.length>0)
{
for(i=0; i<s.length; i++)
{
printf("%c",s.data[i]);
}
printf("\n");
}
}
SqString encrypt(SqString p)
{
int i=0,j;
SqString q;
while(i<=p.length)
{
for(j=0; p.data[i]!=A.data[j]&&j<A.length; j++);
if(j>=A.length)
q.data[i]=p.data[i];
else
q.data[i]=B.data[j];
i++;
}
q.length=p.length;
return q;
}
SqString Unencrypt(SqString q)
{
int i=0,j;
SqString p;
while(i<=q.length)
{
for(j=0; q.data[i]!=B.data[j]&&j<B.length; j++);
if(j>=B.length)
p.data[i]=q.data[i];
else
p.data[i]=A.data[j];
i++;
}
p.length=q.length;
return p;
}
int main()
{
SqString p,q;
char str[MaxSize];
StrAssign(A,"abcdefghijklmnopqrstuvwxyz");
StrAssign(B,"ngzqtcobmuhelkpdawxfyivrsj");
cout<<"输入要操作的字符串:"<<endl;
gets(str);
StrAssign(p,str);
cout<<"加密解密过程如下:"<<endl;
cout<<"用户输入的字符串为:"<<endl;
DispStr(p);
q=encrypt(p);
cout<<"加密后的字符串为:"<<endl;
DispStr(q);
p=Unencrypt(q);
cout<<"解密后的字符串为:"<<endl;
DispStr(p);
return 0;
}
结果截图:
2、
exp4-5.cpp
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <map>
using namespace std;
typedef vector<string>::iterator ITER;
bool comp(string s1,string s2)
{
return s1<s2;
}
int MaxPrefix(ITER s1,ITER s2)
{
int i=0;
while(!(*s1).empty()&&(*s1)[i]==(*s2)[i]) ++i;
return i;
}
int main()
{ cout<<"请输入字符串:"<<endl;
int temp,max;
string s,t,maxt;
vector<string> sa;
map<string,int> rank;
//sa:Suffix Array 后缀数组,此处用vector容器代替
cin>>s;
for(size_t i=0;i<s.size();++i) {//O(N)
t=s.substr(i,s.size());
sa.push_back(t);
rank.insert(pair<string,int>(t,i));
}
stable_sort(sa.begin(),sa.end(),comp);//O(N*logN)
ITER iter,maxi;
max=-1;
for(iter=sa.begin();iter!=sa.end()-1;++iter)//O(N)
{
temp=MaxPrefix(iter,iter+1);
if(temp>max)
{
max=temp;
maxi=iter;
}
}
for(int i=0;i<max;++i)
maxt+=(*maxi)[i];
cout<<"长度为:"<<max<<endl;
cout<<"下标为:"<<rank[maxt]<<endl;
cout<<maxt<<endl; //第一个最长重复字符串
return 0;
}
结果截图: