算法初试2

算法初试

题目:
给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列。

一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。
例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。两个字符串的「公共子序列」是这两个字符串所共同拥有的子序列。

若这两个字符串没有公共子序列,则返回 0。

示例 1:

输入:text1 = “abcde”, text2 = “ace”
输出:3
解释:最长公共子序列是 “ace”,它的长度为 3。
示例 2:

输入:text1 = “abc”, text2 = “abc”
输出:3
解释:最长公共子序列是 “abc”,它的长度为 3。
示例 3:

输入:text1 = “abc”, text2 = “def”
输出:0
解释:两个字符串没有公共子序列,返回 0。

提示:

1 <= text1.length <= 1000
1 <= text2.length <= 1000
输入的字符串只含有小写英文字符。

class Solution {
public:
int longestCommonSubsequence(string text1, string text2) {
using IntIter = std::vector::iterator;

    std::vector<std::pair<int, int>> datas;
    int n1 = text1.size();
    int n2 = text2.size();
    for (int i = 0; i < n1; ++i) {
        char c = text1[i];

        int tt1 = text2.find_first_of(c);
        if (tt1 != -1) {
            bool has_data = false;
            for (int j = 0; j < datas.size(); ++j) {
                if (c == text2[datas[j].first]) {
                    has_data = true;
                }

                int tt2 = text2.find_first_of(c, datas[j].first);
                if (tt2 != -1) {
                    datas[j].first = tt2;
                    datas[j].second++;
                }
            }

            if (has_data == false) {
                datas.push_back(std::make_pair(tt1, 1));
            }
        }
    }

    int max_count = std::numeric_limits<int>::min();
    for (auto data : datas) {
        if (data.second > max_count) {
            max_count = data.second;
        }
    }

    return max_count;
}

};
————————————————
版权声明:本文为CSDN博主「c_木ss」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/SMith7412/article/details/105482099

发布了2 篇原创文章 · 获赞 0 · 访问量 3

猜你喜欢

转载自blog.csdn.net/weixin_47017567/article/details/105501185