列表

详情


NC411. 最长特殊子序列(二)

描述

给定一个长度为 n 的字符串列表,返回他们中最长的特殊子序列的长度。
特殊子序列的定义是:某个字符串的某一个子序列(不一定连续),无法在另一个字符串中找到同样的子序列则称为特殊子序列。

数据范围:, 字符串长度满足

示例1

输入:

["aba","bbb","eae"]

输出:

3

示例2

输入:

["nowcoder","nowcoderr"]

输出:

9

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 3ms, 内存消耗: 424KB, 提交时间: 2022-08-05

class Solution {
  public:
    int longestUniqueSubsequence(vector<string>& strs) {
        int j = 0;
        int z = -1;
        for (int i = 0; i < strs.size(); ++i) {
            for (j = 0; j < strs.size(); ++j) {
                if (i == j) continue;
                if (func(strs[i], strs[j])) {
                    break;
                }
            }
            int H = strs[i].size();
            if (j == strs.size()) z = max(z, H);
        }
        return z;
    }
    
    bool func(string& a, string& b) {
        int j = 0;
        for (int i = 0; i < b.size() && j < a.size(); ++i) {
            if (a[j] == b[i]) j++;
        }
        return j == a.size();
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 468KB, 提交时间: 2022-07-09

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param strs string字符串vector 
     * @return int整型
     */
    int partition(vector<string>& a,int low,int high){
        int i=low,j=high;
        string pivot=a[low],t;
        while(i<=j){
            while(i<j&&a[j].length()<pivot.length())j--;
            while(i<j&&a[i].length()>=pivot.length())i++;
            if(i==j)break;
            t=a[j];
            a[j]=a[i];
            a[i]=t;
        }
        a[low]=a[i];
        a[i]=pivot;
        return i;
    }
    void quickSort(vector<string>& a,int low,int high){
        if(low>=high)return;
        int mid=partition(a,low,high);
        quickSort(a,low,mid-1);
        quickSort(a,mid+1,high);
    }
    int longestUniqueSubsequence(vector<string>& strs) {
        // write code here
        quickSort(strs,0,strs.size()-1);
        string s=strs[0];
        unordered_map<string,int>u;
        u[s]++;
        for(int i=1;i<strs.size();i++){
            if(strs[i].length()<s.length())break;
            if(u[strs[i]]>0)return -1;
            else u[strs[i]]++;
        }
        return s.length();
    }
};

C++ 解法, 执行用时: 4ms, 内存消耗: 420KB, 提交时间: 2022-08-06

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param strs string字符串vector 
     * @return int整型
     */
    int longestUniqueSubsequence(vector<string>& strs) {
        // write code here
        int j=0;
        int z=-1;
        for(int i=0;i<strs.size();++i)
        {
            for(j=0;j<strs.size();++j)
            {
                if(i==j)
                    continue;
                if(func(strs[i],strs[j]))
                {
                    break;
                }
            }
            int H=strs[i].size();
            if(j==strs.size())
                z=max(z,H);
        }
        return z;
    }
    bool func(string &a,string &b)
    {
        int j=0;
        for(int i=0;i<b.size()&&j<a.size();++i)
        {
            if(a[j]==b[i])
                j++;
        }
        return j==a.size();
    }
};

C++ 解法, 执行用时: 4ms, 内存消耗: 424KB, 提交时间: 2022-07-07

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param strs string字符串vector 
     * @return int整型
     */
    int longestUniqueSubsequence(vector<string>& strs) {
        // write code here
        int j=0;
        int res=-1;
        for(int i=0;i<strs.size();++i){
            for(j=0;j<strs.size();++j){
                if(i==j) continue;
                if(func(strs[i],strs[j])){
                    break;
                }
            }
            int len=strs[i].size();
            if(j==strs.size()) res=max(res,len);
        }
        return res;
    }
    bool func(string& a,string& b){
        int j=0;
        for(int i=0;i<b.size()&&j<a.size();++i){
            if(a[j]==b[i]) j++;
        }
        return j==a.size();
    }
};

C++ 解法, 执行用时: 4ms, 内存消耗: 436KB, 提交时间: 2022-07-09

typedef pair<string, int> PAIR;
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param strs string字符串vector 
     * @return int整型
     */
    static bool cmp(string a, string b)
    {
        if(a.length() == b.length())
        {
            return a > b;
        }
        return a.length() > b.length();
    }
    static bool cmp2(PAIR a, PAIR b)
    {
        if(a.first.length() == b.first.length())
        {
            return a.first > b.first;
        }
        return a.first.length() > b.first.length();
    }
    int longestUniqueSubsequence(vector<string>& strs) {
        // write code here
        int ans = -1;
        sort(strs.begin(), strs.end(), cmp);
        map<string, int> mp;
        
        for(auto s : strs)
        {
            mp[s] += 1;
        }
        
        vector<PAIR> v(mp.begin(), mp.end());
        sort(v.begin(), v.end(), cmp2);
        int vis[105] = {0};
        for(int i = 0; i < strs.size(); i++)
        {
            if(vis[i])
                continue;
            for(int j = i+1; j < strs.size(); j++)
            {
                if(vis[j])
                    continue;
                if(strs[i].find(strs[j]) != -1)
                {
                    if(strs[i].size() == strs[j].size())
                    {
                        vis[i] = 1;
                        //cout << v[i].first << " " << v[j].first << endl;
                    }
                        
                    vis[j] = 1;
                }
            }
            if(vis[i] == 0)
            {
                return strs[i].length();
            }
        }
            
        return ans;
    }
};

上一题