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