给定字符串列表 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;
}
};