zoukankan      html  css  js  c++  java
  • 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;
        }
    };
    
  • 相关阅读:
    Linux内存运维操作及常用命令
    Quartz定时任务
    Spark DataSource Option 参数
    Hadoop HDFS命令
    Java,Scala:JDBCUtil,MySqlUtil,PhoenixJDBC
    RedisUtil,Redis工具类
    通过脚本本地下载Jar包
    Redis五种数据类型-设置key的过期时间
    spark整合Phoenix相关案例
    Spark Dataset DataFrame空值null,NaN判断和处理
  • 原文地址:https://www.cnblogs.com/zxcoder/p/12562454.html
Copyright © 2011-2022 走看看