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;
        }
    };
    
  • 相关阅读:
    指针与数组名
    c语言指针函数与函数指针
    c语言结构体
    c语言
    c语言全局变量
    c语言函数传递数组
    c实例_挑战程序竞赛,蚂蚁
    c语言字符串实例
    安又琪-唱得响亮
    乡村爱情
  • 原文地址:https://www.cnblogs.com/zxcoder/p/12562454.html
Copyright © 2011-2022 走看看