HDU—— 2572 终曲

本文介绍了一种通过遍历和比较来寻找三个字符串中的最长公共子串的方法,并提供了一个使用C++实现的具体示例。

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

题意:中文题目。

解题思路:首先找出后面两个串中最长的串,然后以最长的串的长度为初始截取长度从母串的第一个位置依次遍历截取,将每次截取的符合条件的相同长度的串存入一个字符串集合set当中(set有自动排序功能),然后将集合当中的第一个字符串输出即可,若没有则输出No,详见代码。

Code:

#include <iostream>
#include <string>
#include <cstdio>
#include <set>
using namespace std;

set<string> vis;
int Judge(string str1,string str2)//判断两个串是否有包含关系
{
    int flag = 0;
    string str3;
    int len1 = str1.length();
    int len2 = str2.length();
    for(int i = 0; i <= (len1-len2); i++)
    {
        str3 = str1.substr(i,len2);
        if(str3==str2) {flag = 1; break;}
    }
    if(flag) return 1;
    else return 0;
}

int main()
{
    //freopen("input.txt","r",stdin);
    int T;
    cin>>T;
    while(T--)
    {
        string str1,str2;
        string str3,str4;
        cin>>str1>>str2>>str3;
        int len1 = str1.length();
        int len2 = str2.length();
        int len3 = str3.length();
        int Max = max(len2,len3);
        int flag1 = 0;
        for(int j = Max; j<=len1; j++)//截取子串的长度从最长的一个串的长度开始依次增加
        {
            vis.clear();
            for(int i = 0; i<= (len1-j); i++)//每次改变截取长度时都要从新遍历依次母串
            {
              str4 = str1.substr(i,j);
              if(Judge(str4,str2) && Judge(str4,str3)) vis.insert(str4);//将长度相等的符合条件的子串放进set中
            }
            if(vis.size()) {flag1 = 1; break;}//如果集合大小不为零直接跳出
        }
        if(flag1) cout<<*vis.begin()<<endl;//当flag1==1时,直接输出集合当中的第一个字符串即为满足条件的子串
        else cout<<"No"<<endl;//否则输出No
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值