打印所有具有相同数量的零和一的子串,但我无法

Print all the substrings with equal number of zeros and ones, But am not able to

我想打印所有要打印的子字符串,每个子字符串都应该有相同数量的零,ones.I 已经制定了循环,其中 i 指向索引,最初零的数量和一个等于 0循环运行直到它们都变得相等,然后我将其推入向量中。但是我的代码并不 运行 好。我有足够的时间找出可能是什么错误,但我找不到。

输出

0 1 0 0 1 1 0 1 0 1  

预期输出

01 0011 01 01

我无法找出错误,请帮助我。

 #include <iostream>
#include <vector>
using namespace std;
vector<string> maxSubStr(string s, int n)
{
    vector<string> v;
    for (int i = 0; i < n; i++)
    {
        int ones = 0;
        int zeros = 0;
        int j = 0;
        for (j = i; zeros != ones && j<n; j++)
        {
            if (s[j] == '0')
            {
                zeros++;
            }
            else
            {
                ones++;
            }
        }
        if (zeros == ones)
        {
            int size = j - i;
            v.push_back(s.substr(i, size));
        }
        if(j==n){
            break;
        }
        i = j ;
    }
    return v;
}
int main()
{
    string str = "0100110101";
    int n = str.length();
    vector<string> v;
    v = maxSubStr(str, n);
    vector<string>::iterator it;
    for (it = v.begin(); it != v.end(); it++)
    {
        cout << *it << " ";
    }
    return 0;
}

您的代码中有一些小错误。你应该学会使用调试器逐步调试它,错误会变得很明显。

i的循环中,在j的循环中再次设置之前设置j的值是没有用的。那么,循环应该被限制j<n 以防止访问超过字符串末尾。接下来,您不想测试 s[i],而是 s[j]。最后,测试 zeros == ones 应该在 j 循环中并且应该将 i 设置到下一个位置,即 j + 1。代码可以变成:

vector<string> maxSubStr(string s)
{
    vector<string> v;
    int n = s.size();
    for (int i = 0; i < n; i++)
    {
        int ones = 0;
        int zeros = 0;
        int j = 0;
        for (j = i; j < n; j++)
        {
            if (s[j] == '0')
            {
                zeros++;
            }
            else
            {
                ones++;
            }
            if (zeros == ones)
            {
                v.push_back(s.substr(i, j + 1 - i));
                i = j;
                break;
            }
        }
    }
    return v;
}