【问题标题】:Validate string based on alternative 0's and 1's根据替代的 0 和 1 验证字符串
【发布时间】:2026-02-08 17:40:02
【问题描述】:

我正在尝试编写一个将字符串作为输入并将输出作为可以从中生成的有效子字符串数量的方法,该字符串将只有 0 和 1,形成的子字符串的长度仅为偶数。

有效子字符串场景:

子串只有连续的0和1才有效

示例输入:

假设我们有一个字符串 00110,我们从中得到的子字符串是 00,01,11,10,0011,0110(只有偶数长度的奇数长度的子字符串不像 001,011,110 那样有效)只有这些子字符串字符串有效 01,10,0011 有连续的 0 和 1

所以上面例子的输出是3。

条件: 输入字符串长度将低于5<n<10^5

我一直在验证子字符串,尝试了几种不同的方法但没有成功,如果问题需要更多说明,请告诉我。

代码:

 public static int counting(string s)
        {
      //make into substrings function
        var substrs = SubStrings(s);

        foreach (var str in substrs.ToList())
        {
            if (!IsValidStr(str))
                substrs.Remove(str);
        }
        var validstr=substrs.Distinct();

        return validstr.Count();
    }

 private static List<string> SubStrings(string s)
    {
        List<string> substrs = new List<string>();

        for (int i = 0; i < s.Length; i++)
        {
            for (int j = 2; j < s.Length; j += 2)
            {
                if ((s.Length - i >= j))
                {
                    substrs.Add(s.Substring(i, j));
                }
            }

        }
        return substrs;
    }

【问题讨论】:

  • 嗯,第一个测试是检查它们是否是偶数长度......substr.Length % 2 == 0
  • 你试过什么?就目前而言,您只希望我们为您编写一个递归方法
  • 连续的 0 和 1”是什么意思?为什么0110 无效?
  • 我是否正确地假设你的意思是连续的,你的意思是一旦它改变(从 0 到 1,或 1 到 0)然后它不能再变回来?
  • 考虑输入00100。从左到右,有效的子字符串是00011000。但是00 出现了两次。那么这里的正确答案是 3 还是 4?

标签: c# string validation dynamic-programming


【解决方案1】:

此函数将验证您的子字符串,我相信这就是您寻求帮助的原因。

我的理解是子串必须至少有一个1和一个0。并且它们必须连续分组。

这个概念基本上是循环数字以检查它们是否多次更改。然后最后我们检查以确保是否更改过一次。

bool IsValidSubstring(string s)
{
    // Check for a valid length substring.
    if(s.Length == 0 || s.Length % 2 != 0)
        return false;

    // Loop each character and make sure it doesn't change more than once.
    char last = s[0];
    bool hasChanged = false;
    for(var c in s)
    {
        // Check for a change in character.
        if(c != last)
        {
            // If it has already changed once, then it's invalid.
            if(hasChanged)
                return false;
            hasChanged = true;
        }
        last = c;
    }

    // If we get here, the only thing left to check is that it has changed at least once.
    return hasChanged;
}

此函数将为:01,10,0011 返回 true 错误:00,11,0110 这就是你所要求的。

【讨论】: