Leetcode522. 最长特殊序列 II C++

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

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

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

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

 解题思路:

1.编写一个函数用于判断一个字符串是否是另一个字符串的子序列

2.将改定的字符串数组按照字符串长度进行排序

3.枚举排序后的字符串数组,一旦到符合要求的字符串,就立刻返回其长度。如果没有符合要求的字符串,返回 −1。因为子序列越长,越不可能是其它字符串的子序列。、

1.子序列函数

子序列:abd是abcd的子序列,adb不是

可以用增强for循环实现功能

bool isSubseq(string& s, string& t) {
    int i = 0;
    for (char c : t) {//t中的字母按顺序遍历在s中寻找 
    //且i保留了上一次找到的下标 只能在其后找
        for (; i < s.size(); i++)
            if (s[i] == c) continue;
             else break;
        if (i == s.size()) return true;
    }
    return false;

2.字符串数组排序

使用cmp()比较函数

 static bool compare(string a, string b) {
    return a.length() > b.length(); }

为什么cmp函数在作为类成员函数的时候需要static修饰?

这是因为所有我们在类内定义的非static成员函数在经过编译后隐式的为他们添加了一个this指针参数!变为了

bool cmp(Solution *this, int a, int b)

而标准库的sort()函数的第三个cmp函数指针参数中并没有这样this指针参数,因此会出现输入的cmp参数和sort()要求的参数不匹配,从而导致了:
error: reference to non-static member function must be called
而我们知道static静态类成员函数是不需要this指针的,因此改为静态成员函数即可通过

3.枚举

int findLUSlength(vector<string>& strs) { // 动态字符串数组
        // strs按照字符串长度从大到小排序
        sort(strs.begin(), strs.end(), compare); //'aaaa aaa aa'
         for (int i = 0; i < strs.size(); i++) {
            for (int j = 0; j < strs.size(); j++) {
                if (j != i && isSubseq(strs[i], strs[j])) {
                //i在j后面 i的长度比j小
                    goto next;
                }
            }
            return strs[i].length();
            next:;
        }
        return -1;
    }

题解:

class Solution {
public:
//判断s是不是t的子序列
/*
abd是abcd的子序列,adb不是
*/
    bool isSubseq(string& s, string& t) {
    int i = 0;
    for (char c : t) {//t中的字母按顺序遍历在s中寻找 且i保留了上一次找到的下标 只能在其后找
        for (; i < s.size(); i++)
            if (s[i] == c) continue;
             else break;
        if (i == s.size()) return true;
    }
    return false;
}

    static bool compare(string a, string b) { return a.length() > b.length(); }
    int findLUSlength(vector<string>& strs) { // 动态字符串数组
        // strs按照字符串长度从大到小排序
        sort(strs.begin(), strs.end(), compare); //'aaaa aaa aa'
         for (int i = 0; i < strs.size(); i++) {
            for (int j = 0; j < strs.size(); j++) {
                if (j != i && isSubseq(strs[i], strs[j])) {
                    goto next;
                }
            }
            return strs[i].length();
            next:;
        }
        return -1;
    }
};

时间复杂度

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值