相似的字符(TCS CodeVita)降低了时间复杂度

时间:2019-07-16 16:51:29

标签: c++

您必须从用户处获取字符串的长度,然后从用户处输入字符串,然后再取no。用户查询的数量。假设用户给出3个查询4,5,7。那么4,5,7是您必须检查在该位置之前重复多少个相同字符的位置。

输入:

  1. 9(要输入的字符串的长度)
  2. abcabcabc
  3. 3(要查询的查询数)
  4. 4(在第4位检查)
  5. 5(在位置5处检查)
  6. 7(在第7位检查)

输出:

  1. 1
  2. 1
  3. 2

我编写的代码:

#include <iostream>

int main()
{
    int n; // Length of String
    int a[10000]; // Input for Query
    int q; // NO. of queries
    std::cin >> n;
    char ch[n]; // To store the InputString

    for (int i = 1; i <= n; i++) {
        std::cin >> ch[i];
    }

    std::cin >> q;

    for (int j = 1; j <= q; j++) {
        std::cin >> a[j];
    }

    for (int i = 1; i <= q; i++) {
        int count = 0;
        for (int j = 1; j < a[i]; j++) {
            if (ch[j] == ch[a[i]]) {
                count = count + 1;
            }
        }
        std::cout << count << "\n";
    }
    return 0;
}

但是问题是程序的时间复杂度太大,在最坏的情况下是 O(n * q),其中n =字符串的长度,q =字符串的数量查询。如何提高时间复杂度?

1 个答案:

答案 0 :(得分:0)

首先,您的输出不符合分配条件。例如,在位置[1]处,有一个字符'b'(基于0的索引),在该位置之前个重复。在位置[2]处,有一个字符'a',该字符在该位置之前有一个重复。那么,您是说之前包括吗?

第二,这是homework吗? (只是好奇。在这里几乎无法想象任何现实情况……:))

最后,您的问题:

1)组成<query position, count>对的数组

2)仅通过InputString 一次,直到最高query position,并在InputString中的每个位置增加count如果与query position对中的<query position, count>相关。

2.b)进一步优化:首先根据<query position, count>对数组或query position对进行排序。在您的InputString中,转到最低 query position,以便在第一轮中必须检查每对<query position, count>。然后,从[最低InputString + 1]位置开始搜索query position,直到第二最低的query position。您无需担心第二轮中最低的<query position, count>对。等等...