题目

给定字符串列表 strs ,返回其中 最长的特殊序列 的长度。如果最长特殊序列不存在,返回 -1

特殊序列 定义如下:该序列为某字符串 独有的子序列(即不能是其他字符串的子序列)

s子序列可以通过删去字符串 s 中的某些字符实现。

  • 例如,"abc""aebdc" 的子序列,因为您可以删除"aebdc"中的下划线字符来得到 "abc""aebdc"的子序列还包括"aebdc""aeb" 和 “” (空字符串)。

示例 1:

输入: strs = ["aba","cdc","eae"]
输出: 3

示例 2:

输入: strs = ["aaa","aaa","aa"]
输出: -1

提示:

  • 2 <= strs.length <= 50
  • 1 <= strs[i].length <= 10
  • strs[i] 只包含小写英文字母

解答

解题思路:

  1. 首先,我们需要对字符串数组进行排序,将较长的字符串排在前面。这是因为如果一个字符串是另一个字符串的子序列,那么较长的字符串必定不能成为特殊序列。
  2. 排序之后,我们遍历每个字符串,判断它是否是特殊序列。我们需要检查当前字符串是否在剩余的字符串中存在子序列。
  3. 对于每个字符串,我们逐个比较它与剩余字符串的关系。如果当前字符串不是任何其他字符串的子序列,那么它就是一个特殊序列。
  4. 我们只需要返回最长的特殊序列的长度即可。
class Solution {
public:
    // 判断字符串a是否是字符串b的子序列
    bool isSubsequence(const string& a, const string& b) {
        int i = 0, j = 0;
        while (i < a.size() && j < b.size()) {
            if (a[i] == b[j]) {
                i++;
            }
            j++;
        }
        return i == a.size();
    }

    // 找到最长特殊序列的长度
    int findLUSlength(vector<string>& strs) {
        // 根据字符串长度排序,较长的字符串排在前面
        sort(strs.begin(), strs.end(), [](const string& a, const string& b) {
            return a.size() > b.size();
        });

        for (int i = 0; i < strs.size(); ++i) {
            bool is_special = true;
            for (int j = 0; j < strs.size(); ++j) {
                if (i != j && isSubsequence(strs[i], strs[j])) {
                    is_special = false;
                    break;
                }
            }
            if (is_special) {
                return strs[i].size();
            }
        }
        
        return -1;
    }

};