查找字符串中有效子字符串的长度。C#

查找字符串中有效子字符串的长度。C#,c#,C#,嗨,我想找出最长有效子串的长度。有效的子字符串至少包含1个大写字母且不包含数字。我的代码不起作用,请有人帮忙谢谢 class Program { public static void Main(string[] args) { string S = "a02caa3ThisIsValid1bC2a"; Console.WriteLine("The longest valid substring is {0}", solution(S));

嗨,我想找出最长有效子串的长度。有效的子字符串至少包含1个大写字母且不包含数字。我的代码不起作用,请有人帮忙谢谢

class Program

{

    public static void Main(string[] args)
    {
        string S = "a02caa3ThisIsValid1bC2a";

        Console.WriteLine("The longest valid substring is {0}", solution(S));

        Console.ReadKey();
    }

    public static int solution(string S)
    {
        char[] stringarray = S.ToCharArray();
        int slength = S.Length;
        int result = 0;
     //   string resultstring = "";

        for (int i = 0; i < slength; i++)
        {
            char Z = stringarray[i];

            if(char.IsUpper(Z) || char.IsLower(Z) || !char.IsDigit(Z))
            {
                while (char.IsUpper(Z) || char.IsLower(Z) && !char.IsDigit(Z))
                {
                    result += 1;
                 //   resultstring = result.ToString();
                }
            }
        }         
        return result;
    }

}
类程序
{
公共静态void Main(字符串[]args)
{
字符串S=“A02CAA3thisValid1BC2A”;
WriteLine(“最长的有效子字符串是{0}”,解决方案);
Console.ReadKey();
}
公共静态int解决方案(字符串S)
{
char[]stringarray=S.ToCharArray();
int SLENGHT=S.长度;
int结果=0;
//字符串resultstring=“”;
对于(int i=0;i
您的问题在于这个while循环

while (char.IsUpper(Z) || char.IsLower(Z) && !char.IsDigit(Z))
这将无限期运行,因为您不在循环内更新
Z
。所以它永远不会改变,没有改变就没有退出点。

这对我来说很有用:

public static int solution(string S)
{
    return
        S
            .Split("1234567890".ToCharArray()) // split on invalid characters
            .Where(x => x.Any(y => char.IsUpper(y))) // keep only those portions containing an uppercase char
            .Select(x => x.Length) // get the length of each string
            .Max(); // find the longest
}

下面是一个基于问题代码的解决方案:

public static int solution(string S)
{
    int result = 0;
    int tally = 0;
    bool foundUpper = false;

    for (int i = 0; i < S.Length; i++)
    {
        char Z = S[i];

        if (char.IsDigit(Z))
        {
            if (foundUpper && tally > result)
            {
                result = tally;
            }
            tally = 0;
            foundUpper = false;
        }
        else
        {
            tally++;
            foundUpper |= char.IsUpper(Z);
        }
    }
    if (foundUpper && tally > result)
    {
        result = tally;
    }
    return result;
}
公共静态int解决方案(字符串s)
{
int结果=0;
对于(int i=0;i
使用字符串。使用所有数字字符拆分以获取所有子字符串,然后检查哪些子字符串“包含1个大写字母”,并获取最大长度:

        string S = "a02caa3ThisIsValid1bC2a";
        S.Split("0123456789".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)
            .Where(u => u.ToCharArray().Count(c => Char.IsUpper(c)) == 1)
            .Max(s => s.Length);

代码与您编写的完全不同。您正在查找非数字的子字符串,然后在这些子字符串的末尾,您必须检查子字符串中是否至少有一个字符是大写的。如果是,则该子字符串可以是候选字符串,并且必须考虑其长度。通过
upperCaseFound
布尔变量检查是否存在大写字符

public static int LongestSubstring(string s)
{
    int maxLength = 0;

    bool upperCaseFound = false;
    int length = 0;

    foreach (char ch in s)
    {
        if (char.IsDigit(ch))
        {
            if (upperCaseFound && length > maxLength)
            {
                maxLength = length;
            }

            upperCaseFound = false;
            length = 0;
            continue;
        }

        if (char.IsUpper(ch))
        {
            upperCaseFound = true;
        }

        length++;
    }

    if (upperCaseFound && length > maxLength)
    {
        maxLength = length;
    }

    return maxLength;
}
publicstaticintmaxvalid(字符串输入)
{
var max=0;
无功电流=0;
布尔上限=假;
for(int i=0;i最大值)
最大值=电流;
电流=0;
上限=假;
}
其他的
{
电流++;
if(char.IsUpper(输入,i))
上限=真;
}
}
返回最大值;
}

Z
在内部循环中未更新。能否编辑问题以显示一些输入和所需结果?“有效的子字符串是包含1个大写字母且没有数字的字符串”这是高度不明确的。它可以解释为“一个有效的子字符串正好是一个大写字符”,但这可能不是你的意思。请澄清。@spender-我不会说“高度”含糊不清。可能一点也不含糊。为什么你认为是这样?“谜”让我们来看看一些问题串:“A”,“as”,“A”,“as”,“AA”。你能在没有假设的情况下判断哪些是有效的吗?这无法编译。答案已更新为编译并给出正确的结果,否决票可以删除。谢谢你的回答,先生。也许可以添加一些解释:他正在以任意数字拆分字符串(因为它们无效),然后将所选内容减少到所有包含大写字符的内容。之后,他将元素转换为各自的长度,并返回其中最大的一个。这是可行的,先生,但很抱歉,我现在无法理解您的代码(我将在将来研究它)。你能调整我的代码使它工作吗?这将帮助我了解我的错误。@FutureDev-Done。谢谢你,先生。代码帮助我更好地理解了解决方案。我很感兴趣为什么有人否决了这个。此解决方案:提供正确的结果、快速、非常简单的代码,并且使用了比最佳内存更多的内存。我同意上一个,但除非子字符串的数目不是很多,否则这是一个非常好的解决方案。投票人,请在这里写下你的意见,或者私下写。谢谢
        string S = "a02caa3ThisIsValid1bC2a";
        S.Split("0123456789".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)
            .Where(u => u.ToCharArray().Count(c => Char.IsUpper(c)) == 1)
            .Max(s => s.Length);
public static int LongestSubstring(string s)
{
    int maxLength = 0;

    bool upperCaseFound = false;
    int length = 0;

    foreach (char ch in s)
    {
        if (char.IsDigit(ch))
        {
            if (upperCaseFound && length > maxLength)
            {
                maxLength = length;
            }

            upperCaseFound = false;
            length = 0;
            continue;
        }

        if (char.IsUpper(ch))
        {
            upperCaseFound = true;
        }

        length++;
    }

    if (upperCaseFound && length > maxLength)
    {
        maxLength = length;
    }

    return maxLength;
}
    public static int MaxValid(string input)
    {
        var max = 0;
        var current = 0;
        bool upper = false;

        for (int i = 0; i < input.Length; i++)
        {
            if (char.IsDigit(input, i))
            {
                if (upper && current > max)
                    max = current;

                current = 0;
                upper = false;
            }
            else
            {
                current++;
                if (char.IsUpper(input, i))
                    upper = true;
            }
        }

        return max;
    }