• Leetcode_1048. 最长字符串链


    字符串的最长严格递增子序列,前后只能相差一个字符。

    1. 直接O(N^2)暴力建图,然后记忆化跑个最长路。
    2. 直接按字符串长度排序,然后求LIS。

    code1

    class Solution {
    public:
        vector<int> g[1005];
        bool check(string& a,string& b){
            int as=a.size();
            int bs=b.size();
            if(bs!=as+1){
                return false;
            }
            int cnt[26]={0};
            for(int i=0;i<as;i++){
                cnt[a[i]-'a']++;
            }
            for(int i=0;i<bs;i++){
                cnt[b[i]-'a']--;
            }
            for(int i=0;i<26;i++){
                if(cnt[i]!=0 && cnt[i]!=-1){
                    return false;
                }
            }
            return true;
        }
        int dp[1005];
        void dfs(int u){
            if(dp[u]){
                return;
            }
            int ans=0;
            int siz=g[u].size();
            for(int i=0;i<siz;i++){
                int v=g[u][i];
                dfs(v);
                ans=max(ans,dp[v]);
            }
            dp[u]=ans+1;
            return;
        }
        int longestStrChain(vector<string>& words) {
            int n=words.size();
            for(int i=0;i<n;i++){
                for(int j=0;j<n;j++){
                    if(check(words[i],words[j])){
                        cout << i <<"  " <<j <<"
    ";
                        g[i].push_back(j);
                    }
                }
            }
            for(int i=0;i<n;i++){
                dfs(i);
            }
            int ans=0;
            for(int i=0;i<n;i++){
                ans=max(ans,dp[i]);
            }
            return ans;
        }
    };
    

    code2

    bool cmp(string a,string b){
        return a.size()<b.size();
    }
    class Solution {
    public:
        bool check(string& a,string& b){
            int as=a.size();
            int bs=b.size();
            if(bs!=as+1){
                return false;
            }
            int cnt[26]={0};
            for(int i=0;i<as;i++){
                cnt[a[i]-'a']++;
            }
            for(int i=0;i<bs;i++){
                cnt[b[i]-'a']--;
            }
            for(int i=0;i<26;i++){
                if(cnt[i]!=0 && cnt[i]!=-1){
                    return false;
                }
            }
            return true;
        }
        int dp[1005];
        int longestStrChain(vector<string>& words) {
            int n=words.size();
            sort(words.begin(),words.end(),cmp);
            int ans=0;
            for(int i=0;i<n;i++){
                dp[i]=1;
            }
            for(int i=1;i<n;i++){
                for(int j=0;j<i;j++){
                    if(check(words[j],words[i])){
                        dp[i]=max(dp[i],dp[j]+1);
                    }
                }
                ans=max(ans,dp[i]);
            }
            return ans;
        }
    };
    
  • 相关阅读:
    04:求整数的和与均值
    03:均值
    02:财务管理
    C8-3 三角形还是长方形? (100/100 分数)
    C8-2 圆的周长和面积 (100/100 分数)
    C8-1 复数加减乘除 (100/100 分数)
    C7-3 用类实现a+b (100/100 分数)
    C7-2 多继承 (100/100 分数)
    C7-1 账户类(100/100)
    数组第k小数
  • 原文地址:https://www.cnblogs.com/zxcoder/p/12562454.html
Copyright © 2020-2023  润新知