亲宝软件园·资讯

展开

Leetcode_1048. 最长字符串链

Keane1998 人气:2

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

  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 <<"\n";
                    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;
    }
};

加载全部内容

相关教程
猜你喜欢
用户评论