• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
p-boost-q
博客园    首页    新随笔    联系   管理    订阅  订阅
1048. 最长字符串链

给出一个单词数组 words ,其中每个单词都由小写英文字母组成。

如果我们可以 不改变其他字符的顺序 ,在 wordA 的任何地方添加 恰好一个 字母使其变成 wordB ,那么我们认为 wordA 是 wordB 的 前身 。

例如,"abc" 是 "abac" 的 前身 ,而 "cba" 不是 "bcad" 的 前身
词链是单词 [word_1, word_2, ..., word_k] 组成的序列,k >= 1,其中 word1 是 word2 的前身,word2 是 word3 的前身,依此类推。一个单词通常是 k == 1 的 单词链 。

从给定单词列表 words 中选择单词组成词链,返回 词链的 最长可能长度 。
 

示例 1:

输入:words = ["a","b","ba","bca","bda","bdca"]
输出:4
解释:最长单词链之一为 ["a","ba","bda","bdca"]
示例 2:

输入:words = ["xbc","pcxbcf","xb","cxbc","pcxbc"]
输出:5
解释:所有的单词都可以放入单词链 ["xb", "xbc", "cxbc", "pcxbc", "pcxbcf"].
示例 3:

输入:words = ["abcd","dbqca"]
输出:1
解释:字链["abcd"]是最长的字链之一。
["abcd","dbqca"]不是一个有效的单词链,因为字母的顺序被改变了。

class Solution {
public:
    //1. 检查字符串a是不是字符串b得前身
    bool isQianshen(string& a, string& b)
    {
        //Ⅰ.b得长度比a的长度大 1
        if(a.length() + 1 != b.length())
        {
            return false;
        }
        int lenA = a.length(), lenB = b.length();
        for(int i = 0,j = 0;j < lenB;++j)
        {
            if(a[i] == b[j])
            {
                i++;
            }
            if(i == lenA) //这里已经保证了a的长度+1等于b的长度了,所以这里不用再判断j的大小了
            {
                return true;
            }
        }
        return false;
    }
    int longestStrChain(vector<string>& words) {
        sort(words.begin(), words.end(), [](string& a, const auto & b)
        {
            return a.length() <= b.length();
        });
        // //验证一下看看有木有排序成功
        // for(vector<string>::iterator i = words.begin();i != words.end();++i)
        // {
        //     cout << *i << " ";
        // }
        int wordsLength = words.size();
        vector<int> f(wordsLength, 1); //初始化f,大小为wordsLength, 初始值都为1
        int result = 0;
        for(int i = 0;i < wordsLength;++i)
        {
            for(int j = 0;j < i;++j)
            {
                if(isQianshen(words[j], words[i]))
                {
                    f[i] = max(f[i], f[j]+1);
                }
            }
            result = max(result, f[i]);
        }

        return result;
    }
};

 

posted on 2022-09-05 16:35  p-boost-q  阅读(41)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3