题解 | 查找两个字符串a,b中的最长公共子串

查找两个字符串a,b中的最长公共子串

https://www.nowcoder.com/practice/181a1a71c7574266ad07f9739f791506

活动地址: 牛客春招刷题训练营 - 编程打卡活动

#pragma clang diagnostic push

#pragma ide diagnostic ignored "cppcoreguidelines-narrowing-conversions"

#pragma ide diagnostic ignored "hicpp-signed-bitwise"

#pragma GCC optimize ("Ofast,unroll-loops")

#pragma GCC optimize("no-stack-protector,fast-math")

 

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

typedef pair<ll, ll> pll;

typedef pair<int, int> pii;

typedef pair<double, double> pdd;  

typedef vector<int> vi;

typedef vector<ll> vll;

typedef vector<double> vd;

typedef vector<string> vs;

typedef vector<vi> vvi;

typedef vector<vvi> vvvi;

typedef vector<vll> vvll;

typedef vector<vvll> vvvll;

typedef vector<pii> vpii;

typedef vector<vpii> vvpii;

typedef vector<pll> vpll;

typedef vector<vpll> vvpll;

typedef vector<pdd> vpdd;

typedef vector<vd> vvd;

#define yn(ans) printf("%s\n", (ans)?"Yes":"No");

#define YN(ans) printf("%s\n", (ans)?"YES":"NO");

template<class T> bool chmax(T &a, T b) {

    if (a >= b) return false;

    a = b; return true;

}

template<class T> bool chmin(T &a, T b) {

    if (a <= b) return false;

    a = b; return true;

}

#define FOR(i, s, e, t) for ((i) = (s); (i) < (e); (i) += (t))

#define REP(i, e) for (int i = 0; i < (e); ++i)

#define REP1(i, s, e) for (int i = (s); i < (e); ++i)

#define RREP(i, e) for (int i = (e); i >= 0; --i)

#define RREP1(i, e, s) for (int i = (e); i >= (s); --i)

#define all(v) v.begin(), v.end()

#define pb push_back

#define qb pop_back

#define pf push_front

#define qf pop_front

#define maxe max_element

#define mine min_element

ll inf = 1e18;

#define DEBUG printf("%d\n", __LINE__); fflush(stdout);

template<class T> void print(vector<T> &v, bool withSize = false) {

    if (withSize) cout << v.size() << endl;

    REP(i, v.size()) cout << v[i] << " ";

    cout << endl;

}

mt19937_64 rng((unsigned int) chrono::steady_clock::now().time_since_epoch().count());

 

int __FAST_IO__ = []() {

    std::ios::sync_with_stdio(0);

    std::cin.tie(0);

    std::cout.tie(0);

    return 0;

}();

#include<bits/stdc++.h>

using  namespace std;

#define mod 1000000007

typedef long long ll;

#define int  long long

inline ll read() // void int &n

{

    ll s=0,f=1;

    char c=getchar();

    while(c>'9'||c<'0')    

{

        if(c=='-')  

            f=-1;  

        c=getchar();

    }

    while(c>='0'&&c<='9')

    {

        s=(s<<1)+(s<<3)+c-'0';

        c=getchar();

    }

    return s*f;

}

inline void write(int n)

{

if(n<0)

{

  putchar('-');

  n=-n;

}

   

if(n>10) write(n/10);

putchar(n%10+'0');

}

int jiechen(int n)

{

    int sum = 1;

    for (int i = 2; i <= n; i++)

        sum = sum * i % mod;

    return sum % mod;

}

int qsm(ll a, ll p)

{

    ll s=1;

    while(p)

    {

        if(p&1)

         s=s*a%mod;

      a=a*a%mod;

    }

       return s;

}

ll isprime(ll x)

{

    if(x<2)

        return 0;

    for(int i=2;i<=x/i;i++)

        if(x%i==0)

            return 0;

    return 1;

}

const int N=3e6+10;

// bool vis[N];

// int prime[N],kk=0;

// void init()

// {

//  vis[1] = true; vis[0] = true;

//  for (int i = 2; i <= N; i++)

//  {

//      if (!vis[i])

//      {

//          prime[kk++] = i;

           

//      }

//      for (int j = 0; j < kk; j++)

//      {

//          if (prime[j] * i > N)

//              break;

//          vis[prime[j] * i] = true;

//          if (i % prime[j] == 0)

//              break;

//      }

//  }

// }

void solve()

{

     int n,max=0;

     char a[1100],b[1000],ans[1000];

     while(scanf("%s %s",a,b)!=EOF){// 输入

         if(strlen(a)>strlen(b)){ // 交换

            char t[1100];

            strcpy(t,a);

            strcpy(a,b);

            strcpy(b,t);

         }

         for(int i=0;i<strlen(a);i++){// 因为是从短的字符串中选

            for(int j=0;j<strlen(b);j++){

                n=0;

                while(a[i+n]==b[j+n]&&a[i+n]!='\0'){

                    n++; // 判断

                }

                if(n>max){ // 找最长公共子串

                    max=n;

                    strcpy(ans,a+i);

                    ans[max]='\0';

                }

            }

         }

         printf("%s\n",ans); // 输出

     }

   

}

signed main()

{

ios::sync_with_stdio(false);

cin.tie(0);

cout.tie(0);

    int _=1;

    //cin>>_;

    while(_--)

    {

        solve();

    }

    return 0;

}

活动地址: 牛客春招刷题训练营 - 编程打卡活动

全部评论

相关推荐

01-28 16:12
中南大学 Java
几年前还没有chatgpt的时候,刷题真的是很痛苦。刷不出来只能看题解,题解有几个问题:第一个是每次看的写题解的人都不一样,很难有一个统一的思路;第二个也是最重要的是,题解只提供了作者自己的思路,但是没有办法告诉你你的思路哪里错了。其实很少有错误的思路,我只是需要被引导到正确的思路上面去。所以传统题解学习起来非常困难,每次做不出来难受,找题解更难受。但是现在chatgpt能做很多!它可以这样帮助你&nbsp;-1.&nbsp;可以直接按照你喜欢的语言生成各种解法的题解和分析复杂度。2.&nbsp;把题和你写的代码都发给它,它可以告诉你&nbsp;你的思路到底哪里有问题。有时候我发现我和题解非常接近,只是有一点点🤏想错了。只要改这一点点就是最优解。信心倍增。3.&nbsp;如果遇到不懂的题解可以一行一行询问为什么要这样写,chatgpt不会嫌你烦。有时候我觉得自己的range写错了,其实那样写也没错,只是chat老师的题解有一点优化,这个它都会讲清楚。4.&nbsp;它可以帮你找可以用同类型解法来做的题。然后它可以保持解法思路不变,用一个思路爽刷一个类型的题。如果题目之间思路又有变化,它会告诉你只有哪里变了,其他的地方还是老思路。5.&nbsp;它也可以直接帮你总结模板,易错点。经过chat老师的指导,我最大的改变是敢刷题了。之前刷题需要先找某一个人写的算法题repo,然后跟着某一个人他的思路刷他给的几个题。如果想写别的题,套用思路失败了,没有他的题解,也不知道到底哪里错了;看别人的题解,思路又乱了。这个问题在二分查找和dp类型的题里面特别常见。但是现在有chat老师,他会针对我的代码告诉我我哪里想错了,应该怎么做;还按照我写代码的习惯帮我总结了一套属于我的刷题模板。每天写题全是正反馈!
牛客981:不刷才是爽
AI时代的工作 VS 传...
点赞 评论 收藏
分享
01-30 09:45
燕山大学 Java
喵_coding:这种直接跑就完事了 哪有毕业了才签合同 任何offer和三方都没有的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务