反转具有约束要求的字符串

Reversing a string with constrained requirements

我刚开始学习 C#,需要一些帮助。我必须反转字符串并仅使用 ifelseswitchs.Lengths.Substrings[]:[= 检查回文18=]

    static string MyReverseString(string s)
    {
        int len = s.Length;
        string NewS= "";
        if (len != 0)
        {
            NewS = NewS + s[len];

            return MyReverseString(s.Substring(0, (len - 1)));
        }
        else
        {
            return NewS;

        }
    }    

我得到

"Index was outside the bounds of the array."

你的大体思路是对的,但你还差得远。

使用递归时,先编写不需要递归的情况。反转字符串时,什么是简单的情况?那么,当字符串为空或只有一个字符长时。好的,让我们开始吧:

public static string Reverse(string s)
{
    if (s.Length <= 1)
        return s;

    //do something else
}

好的,现在,如果 s 不为空,我们如何递归反转?好吧,让我们考虑一下当前步骤中应该return编辑什么。显然,如果我们要反转s,不管我们return,我们知道第一个字母需要是s的最后一个字母。好的,让我们开始吧,看看它会带我们去哪里:

public static string Reverse(string s)
{
    if (s.Length <= 1)
        return s;

    return s[s.Length - 1] + //something
}

那个东西是什么?好吧,它必须是没有最后一个字母的 s 的反面,我们已经处理了那个,记得吗?但是……哦等等!我已经知道如何反转字符串了,不是吗? Reverse(s.Substring(0, s.Length - 1)(递归是不是很神奇?)

中提琴:

public static string Reverse(string s)
{
    if (s.Length <= 1)
        return s;

    return s[s.Length - 1] + Reverse(s.Substring(0, s.Length - 1));
}

您甚至不需要 switchelse

此处,s[len] 抛出 IndexOutOfRange 异常。比方说 - 如果你有字符串 s = "abc" 那么索引从 0 开始。所以 s[2] 将是 "c" 并且字符串的长度是 3。所以,如果你尝试获取 s[len]即s[3],会抛出异常

看看 - Best way to reverse a string

要反转字符串,请将其切成两半,交换两半并以这种方式递归反转它们,直到它们的大小为 1 或 0 个字符。

要检查回文,您需要检查第一个字符和最后一个字符是否相同。如果不是这样,则该字符串绝对不是回文。如果为真,则以相同的方式递归检查原始字符串的较小部分(除了第一个和最后一个字符)是否为回文。

    static string Reverse(string s)
    {
        if (s.Length >= 2)
            return Reverse(s.Substring(s.Length / 2)) + Reverse(s.Substring(0, s.Length / 2));
        else
            return s;
    }

    static bool IsPalindrome(string s)
    {
        if (s.Length <= 1)
            return true;

        if (s[0] == s[s.Length - 1] && IsPalindrome(s.Substring(1, s.Length-2)))
            return true;
        else
            return false;
    }

试试这个:

public static string MyReverseString(string s)
{
    return MyReverseString(s, s.Length - 1);
}

private static string MyReverseString(string s, int index)
{
    if (index > 0)
    {
        return s[index] + MyReverseString(s, index - 1);
    }
    else
    {
        return s[index].ToString();
    }
}

这样就避免了使用.Substring(稍微提高了效率)。

如果你想找到一个回文并且你不关心反转字符串,那么试试这个:

public static bool IsPalindrome(string s)
{
    return IsPalindrome(s, 0, s.Length - 1);
}

private static bool IsPalindrome(string s, int start, int finish)
{
    if (finish - start <= 0)
    {
        return true;
    }
    else
    {
        if (s[start] != s[finish])
        {
            return false;
        }
        else
        {
            return IsPalindrome(s, start + 1, finish - 1);
        }
    }
}

这个最终方法可以缩短为:

private static bool IsPalindrome(string s, int start, int finish)
{
    return (finish - start <= 0) || (s[start] == s[finish]) && IsPalindrome(s, start + 1, finish - 1);
}