【问题标题】:Find total number of substrings with 1's greater than 0's, need optimization查找 1 大于 0 的子串总数,需要优化
【发布时间】:2021-09-21 10:06:12
【问题描述】:

给定和字符串,我们需要找出 1 大于 0 的子字符串的总数。

我使用动态编程解决了这个问题,但我无法提出解决方案,我成功编写了一个简单的逻辑,但我无法优化代码(即超过时间限制)

任何关于优化的帮助或对新方法的建议都将得到充分的帮助。 以下代码的时间复杂度为 O(n^3) 任何降低时间复杂度的解决方案都会有所帮助。

提前致谢。

我使用的代码:

#include<iostream>
#include<string>
#include<algorithm>

using namespace std;

int main(){
    int tc =0; //total count
    string st; //original string
    getline(cin,st);
    int lent = st.size(); //size of string
    for(int i =0;i<lent;i++){ //loop to generate all possible substrings
        int j = lent-1;
        while(j>=i){
            
            string st1(st.begin()+i,st.end()-j+i); // A substring
            int c1 = count(st1.begin(),st1.end(),'1'); // count of 1's in substring
            if(c1 > st1.size()-c1) tc++; // Condition to check if 1's are more
            j--;
        }
    }
    cout << tc; // Print total substrings
}

注意:子字符串是字符串中连续的字符序列。 有关子字符串的更多信息,请访问Wikipedia

【问题讨论】:

  • 1 总是大于 0。你的意思是 1 的数量大于 0 的数量吗?
  • 这是 O(n^3),计数也是 O(n)。获得 O(n^2) 不应该那么难。
  • @463035818_is_not_a_number 是的,该子字符串中 1 的总数应大于其中 0 的总数。
  • @maraca 感谢编辑。
  • 检查我的答案,你可以在O(log n)计算它

标签: c++ algorithm optimization time-complexity substring


【解决方案1】:

将“0”和“1”分别视为整数 1 和 -1。然后字符串变成一个整数数组。计算其前缀和数组s,即s[0] = 0s[i] = a[0] + ... + a[i - 1]。现在每个 '1's > '0's 数量的子字符串对应于一对(i, j),这样i &lt; js[i] &gt; s[j]。然后您可以使用find total number of (i,j) pairs in array such that i<j and a[i]>a[j] 中的技巧。时间复杂度为 O(n log n)。

【讨论】:

  • 考虑字符串“10”。那么哪对 (i,j) 对应于子串“1”?
  • @PatrickParker 添加s[0]=0(和s[i]=a[0]+...+a[i-1])可以解决这个问题。
  • @OpOp_1 这是另一个问题。
  • @xskxzr 是的,对不起。
【解决方案2】:

问题是您从同一个起点多次计算相同的字符。您可以从每个起点轻松计算 1 和 0 一次:在您遍历子字符串的同时。从长度为 0 的子字符串开始,而不是从最长的子字符串开始。

在此更改之后,您将从 O(n^3) 减少到 O(n^2),而无需做任何不寻常或违反直觉的事情。

“是 O(n^2) 最优化的解决方案”——不,但这是改进算法的良好第一步。可以进一步优化。

【讨论】:

  • 这种方法通过使用前缀数组将时间复杂度降低到 O(n^2),是 O(n^2) 最优化的解决方案,是否有可能达到 O(n )?
猜你喜欢
  • 2018-06-19
  • 2012-02-01
  • 1970-01-01
  • 2014-02-15
  • 1970-01-01
  • 2019-03-18
  • 2015-01-31
  • 1970-01-01
相关资源
最近更新 更多