zoukankan      html  css  js  c++  java
  • 华为笔试题--最长公共子串

    题目描述

    查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。

    输入描述:

    输入两个字符串

    输出描述:

    返回重复出现的字符

    输入

    abcdefghijklmnop
    abcsafjklmnopqrstuvw

    输出

    jklmnop

    #include <iostream>
    #include <vector>
    #include <string>
    #include <algorithm>
    using namespace std;
    //最长公共子串
    class Solution {
    public:
        int longestSubstring(string x, string y) {
            if (x.size() > y.size()) swap(x, y); // 较短串中最先出现的那个
            vector<vector<int> > f(x.size() + 1, vector<int>(y.size() + 1));
            int max = 0, pos = 0;
            
            for (int i = 1; i <= x.size(); i++) {
                for (int j = 1; j <= y.size(); j++) {
                    if (x[i - 1] != y[j - 1]) f[i][j] = 0;
                    else f[i][j] = f[i - 1][j - 1] + 1;
                    if (max < f[i][j]) {
                        max = f[i][j];
                        pos = i;
                    }
                }
            }
            cout << x.substr(pos - max, max) << endl;
            return max;
        }
    };
    
    int main()
    {
        string x, y;
        while (cin >> x >> y) {
            Solution().longestSubstring(x, y);
        }
        return 0;
    }
  • 相关阅读:
    jquery学会的
    oracle技巧-持续更新
    c语言技巧--长期更新
    2019暑假集训 最大子树和
    2019暑假集训 细胞分裂
    2019暑假集训 金明的预算方案
    2019暑假集训 能量项链
    2019暑假集训 神经网络
    0023-特殊的方程
    0022-并联电阻
  • 原文地址:https://www.cnblogs.com/joker1937/p/10684986.html
Copyright © 2011-2022 走看看