У вас есть признаки выделенных слов ... Я думаю, что ниже это хороший, быстрый подход, так как он не требует "нахождения" каждого слова (для выполнения кругового цикла). Для этого он использует «размер куска», полученный из ряда символов, а не слов. Затем вы могли бы «округлить вверх» или «округлить вниз» до ближайшего окончания слова, и там у вас есть кусок.
Метод, позволяющий определить, сколько выделенных признаков находится в пределах «размера фрагмента» в вашем образце, может быть лучше, я думаю.
Псевдо
string GetHighestDensityChunk(){
// {chunk size} = 400 * average word length
// {possible start positions} = 0, highlighted indicies, and (sample - {chunk size})
int position
int bestPositionSoFar = 0
int maxHighLightedCountSoFar = 0
for each position in {possible start position}
{
highlightedCount = GetNumberOfHighlightedWithinChunkSize(position)
if(highlightedCount > maxHighLightedCountSoFar)
{
maxHighLightedCountSoFar = highlightedCount
bestPositionSoFar = position
}
}
// "round up" to nearest word end
// gives index of next space after end of chunk starting from current best position
{revised chunk size} = sample.indexOf(' ', startingAt = bestPositionSoFar + {chunk size}) - bestPositionSoFar
return sample.substring(bestPositionSoFar, {revised chunk size})
}
int GetNumberOfHighlightedWithinChunkSize(position)
{
numberOfHighlightedInRange = 0
// starts from current position and scans forward counting highlighted indicies that are in range
for(int i= {possible start position}.indexOf(position); i<= {possible start position}.length; i++){
if({possible start position}[i] < position + {chunk size}){
numberOfHighlightedInRange++;
} else {
break;
}
}
return numberOfHighlightedInRange;
}