Actually, the longest string chain is another kind of longest increasing subsequence.
You can simply think the string chain is a special kind of increasing thing.
The only different thing you need to inherit the previous state is you need to judge if the current word is the same kind of string.
class Solution {
public:
bool check(string &a, string &b){
if(a.length() > b.length())return check(b, a);
if(a.length() + 1 != b.length())return 0;
int n = a.length();
for(int i = 0, j = 0; i < b.length(); i++){
if(a[j] == b[i]){
j++;
n--;
}
}
return n==0;
}
static bool cmp(string &a, string &b){return a.length() < b.length();}
int longestStrChain(vector<string>& words) {
int n = words.size();
vector<int> dp(n + 1, 1);
sort(words.begin(), words.end(), cmp);
int ans = 1;
dp[0] = 1;
for(int i = 1; i < n; i++){
for(int j = 0; j < i; j++){
if(check(words[i], words[j])){
dp[i] = max(dp[i], dp[j] + 1);
}
ans = max(ans, dp[i]);
}
}
return ans;
}
};