(数据结构)1.文本串加密和解密程序 2.求一个串中出现的第一个最长重复字符串

本文介绍了一个文本串的加密解密程序及最长重复子串的查找方法。通过字母映射表进行加密解密,实现了字符串的转换。同时,采用顺序结构存储和简单模式匹配方法,找出字符串中的最长重复子串及其位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实验内容

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;  
}  

结果截图:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值