c ++中的最大子序列

时间:2018-05-21 10:29:30

标签: c++ sequence subsequence

问题:

我的代码中的错误在哪里?

Promlem:

我想在字符串中找到最大的唯一子序列。示例:对于aabbaba,答案为2(abba)。我想通过迭代字符串一次来做到这一点。只允许使用小写字母。

正如@hvd指出的那样,如果子序列中的所有字母都是唯一的,则子序列是唯一的。字符串中可以有多次相同的唯一子序列。

方法:

  • 从字符串的第一个字母开始并迭代结束
  • 如果您还没有看到这封信,请写出向量unique中出现的字母的位置
  • 增加此子序列的计数
  • 如果你看到这封信,就开始一个新的后续序列。使用从当前位置到最后一次出现的距离初始化新的子序列。示例:字符串为exampletzu。我们在第二个e。当前指数为6.当前最大子序列为6(exampl)。转到t并创建一个新的子序列。将其初始化为7(xamplet)。
  • 你知道如果当前的子序列等于26,你可以中止,因为这是最大可能的

代码:

#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();
     }

1 个答案:

答案 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();
     }