问题:
我的代码中的错误在哪里?
Promlem:
我想在字符串中找到最大的唯一子序列。示例:对于aabbaba
,答案为2(ab
或ba
)。我想通过迭代字符串一次来做到这一点。只允许使用小写字母。
正如@hvd指出的那样,如果子序列中的所有字母都是唯一的,则子序列是唯一的。字符串中可以有多次相同的唯一子序列。
方法:
unique
中出现的字母的位置exampletzu
。我们在第二个e。当前指数为6.当前最大子序列为6(exampl
)。转到t并创建一个新的子序列。将其初始化为7(xamplet
)。 代码:
#include <iostream>
#include <vector>
#include <algorithm>
//#include <bits/stdc++.h>
#include <string>
using namespace std;
int main(int argc, char *argv[])
{
typedef vector<int>::iterator it;
int length = 7;
string p = "aabbaba";
// result
vector<int> max(length, 0);
int subSeq = 0;
// alphabet
vector<int> unique(26, -1);
bool flag = false;
for (int i = 0; i < length; ++i)
{
int pos = (p[i] - 97) % 26;
if (unique[pos] != -1)
{
// letter already existed. Start new max
++subSeq;
max[subSeq] = i - unique[pos] - 1;
for (int j = 0; j < unique.size(); ++j)
{
if (unique[j] != -1)
{
unique[j] = unique[pos];
}
}
}
++max[subSeq];
if (max[subSeq] == 26)
{
flag == true;
break;
}
unique[pos] = i;
}
int result = 0;
if (!flag)
{
for (it i = max.begin(); i != max.end(); ++i)
{
if (*i > result)
{
result = *i;
}
}
}
else
{
result = 26;
}
cout << result << endl;
cout.flush();
}
答案 0 :(得分:0)
当您更新unique
时,您应该保留自unique[pos]
以来已经发生过的那些信件:
#include <iostream>
#include <vector>
#include <algorithm>
//#include <bits/stdc++.h>
#include <string>
using namespace std;
int main(int argc, char *argv[])
{
typedef vector<int>::iterator it;
p = argv[1];
length = p.length();
// result
vector<int> max(length, 0);
int subSeq = 0;
// alphabet
vector<int> unique(26, -1);
bool flag = false;
for (int i = 0; i < length; ++i)
{
int pos = (p[i] - 97) % 26;
if (unique[pos] != -1)
{
// letter already existed. Start new max
++subSeq;
max[subSeq] = i - unique[pos] - 1;
for (int j = 0; j < unique.size(); ++j)
{
if (unique[j] != -1)
{
if (unique[j] < unique[pos]) {
unique[j] = unique[pos];
}
}
}
}
++max[subSeq];
if (max[subSeq] == 26)
{
flag == true;
break;
}
unique[pos] = i;
}
int result = 0;
if (!flag)
{
for (it i = max.begin(); i != max.end(); ++i)
{
if (*i > result)
{
result = *i;
}
}
}
else
{
result = 26;
}
cout << result << endl;
cout.flush();
}