如何用重复的字符分割字符串?

时间:2019-05-03 14:53:57

标签: c# string

我正在做一个代码战凯特,我需要在其中实现代码突出显示。我需要将代码字符串拆分为重复字符的字符串,向它们添加适当的突出显示标签,最后将其全部连接并返回。您可以自己(https://www.codewars.com/kata/roboscript-number-1-implement-syntax-highlighting)训练此kata。我想到的第一步是用重复的字符分割代码。但是我发现很难提出有效的算法。所以,我需要你的帮助。

输入:"FFFR345F2LL"

输出:"FFF", "R", "345", "F", "2", "LL"

1 个答案:

答案 0 :(得分:0)

您无需将字符串拆分然后再放回原处,只需一次将字符串移动一个字符,然后从中构建结果字符串即可。如果将当前字符与前一个字符进行比较,则可以确定是先添加结束标记,还是仅将当前字符附加到前一个字符(即组“重复”字符)。

private static string GetOpeningSpan(char chr)
{
    // return an opening span with the correct color
    var validCharacters = new[] 
        {'F', 'L', 'R', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};

    if (!validCharacters.Contains(chr)) return "<span>";

    var color = chr == 'F' ? "pink" : chr == 'L' ? "red" : chr == 'R' ? "green" : "orange";

    return $"<span style=\"color: {color}\">";
}

private const string ClosingSpan = "</span>";

private static string GetHighlightedString(string input)
{
    if (string.IsNullOrWhiteSpace(input)) return input;

    // Add the opening span and first character
    var result = new StringBuilder().Append(GetOpeningSpan(input[0]) + input[0]);

    for (int i = 1; i < input.Length; i++)
    {
        var thisChar = input[i];
        var prevChar = input[i - 1];

        // If this character is the same as the previous one, just add it
        if (thisChar == prevChar || (char.IsDigit(thisChar) && char.IsDigit(prevChar)))
        {
            result.Append(thisChar);
        }
        else
        {
            // Add a closing span, and opnening span, and this character
            result.Append(ClosingSpan + GetOpeningSpan(thisChar) + thisChar);
        }
    }

    // Add a final closing span
    result.Append(ClosingSpan);

    return result.ToString();
}