【问题标题】:How to split string by repeated characters? [closed]如何通过重复字符拆分字符串? [关闭]
【发布时间】:2019-09-22 03:34:46
【问题描述】:

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

输入:"FFFR345F2LL"

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

【问题讨论】:

  • “345”不是一组重复的字符。
  • 您可以使用正则表达式来完成它。 stackoverflow.com/questions/1660694/… 是匹配 10 次而不是 3 次的示例,但你明白了
  • 恐怕这不是编码服务。你需要展示你尝试过的东西。
  • 您不需要拆分字符串,您只需遍历字符串并检查每个字符

标签: c# string


【解决方案1】:

您可以一次遍历字符串一个字符,然后从中构建一个结果字符串,而不是拆分字符串然后将其重新组合在一起。如果将当前字符与前一个字符进行比较,则可以确定是否先添加结束标记,或者只是将当前字符附加到前一个字符(即分组“重复”字符)。

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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-16
    • 1970-01-01
    • 1970-01-01
    • 2017-03-21
    • 2013-03-03
    • 1970-01-01
    • 2016-04-28
    相关资源
    最近更新 更多