C ++中最长的不常见子序列II
假设我们有一个字符串列表;我们必须找到其中最长的不常见子序列。最长的不常见子序列实际上是这些字符串之一的最长子序列,并且此子序列不应是其他字符串的任何子序列。
我们知道,子序列是一种序列,可以通过删除一些字符而不改变其余元素的顺序来从一个序列派生。
在这里,我们将获取一个字符串列表,并且输出必须是最长的不常见子序列的长度。如果没有最长的不常见子序列,则返回-1。
因此,如果输入像“ aba”,“ cdc”,“ eae”,则输出将为3
为了解决这个问题,我们将遵循以下步骤-
定义一个函数
isSubsequence()
,这将需要a,b,j:= 0
对于初始化i:= 0,当i <a的大小时,更新(将i增加1),执行-
(将j增加1)
如果j <b的大小并且a [i]与b [j]相同,则-
当b的大小与j相同时返回true
定义一个函数
getDuplicates()
,它将接受一个数组strs,定义一组访问,另一组退出
对于初始化i:= 0,当i <strs的大小时,更新(将i增加1),执行-
将strs [i]插入ret
如果访问了strs [i],则-
将strs [i]插入访问
返回ret
从主要方法中,执行以下操作-
根据字符串长度对数组str进行排序
定义一组重复项:= getDuplicates(strs)
对于初始化i:= 0,当i <strs的大小时,更新(将i增加1),执行-
如果isSubsequence(strs [j],strs [i])为假,则-
除此以外
strs的返回大小
如果j与i-1相同,则-
从循环中出来
strs的返回大小
忽略以下部分,跳至下一个迭代
如果strs [i]一式两份,则-
如果我等于0,则-
对于初始化j:= 0,当j <i时,更新(将j增加1),执行-
返回-1
例
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h>using namespace std;
class Solution {
public:
static bool cmp(string a, string b){
return a.size() > b.size();
}
int findLUSlength(vector<string>& strs){
sort(strs.begin(), strs.end(), cmp);
set<string> duplicates = getDuplicates(strs);
for (int i = 0; i < strs.size(); i++) {
if (duplicates.count(strs[i]))
continue;
if (i == 0)
return strs[i].size();
for (int j = 0; j < i; j++) {
if (!isSubsequence(strs[j], strs[i])) {
if ((j == i - 1)) {
cout << i << endl;
return strs[i].size();
}
}
else
break;
}
}
return -1;
}
bool isSubsequence(string a, string b){
int j = 0;
for (int i = 0; i < a.size(); i++) {
if (j < b.size() && a[i] == b[j])
j++;
}
return j == b.size();
}
set<string> getDuplicates(vector<string>& strs){
set<string> visited;
set<string> ret;
for (int i = 0; i < strs.size(); i++) {
if (visited.count(strs[i])) {
ret.insert(strs[i]);
}
visited.insert(strs[i]);
}
return ret;
}
};
main(){
Solution ob;
vector<string> v = {"aba", "cdc", "eae"};
cout << (ob.findLUSlength(v));
}
输入值
{"aba", "cdc", "eae"}
输出结果
3
以上是 C ++中最长的不常见子序列II 的全部内容, 来源链接: utcz.com/z/345288.html