Home > Mobile >  How can I grab the index of where the longest identical consecutive portion of a string begins
How can I grab the index of where the longest identical consecutive portion of a string begins

Time:09-08

I'd like the code to output index 6 since d is the starting point in terms of the longest identical consecutive portion in the string.

Not sure what I'm doing wrong here but it's currently returning 3 instead. Seems like I'm going in the right direction but something is missing but I can't pinpoint what.

Any feedback is appreciated! :)

$str = "abbcccddddcccbba";
$array = preg_split('/(.)(?!\1|$)\K/', $str);
$lengths = array_map('strlen', $array);
$maxLength = max($lengths);
$ans = array_search($maxLength, $lengths); // returns 3 but need it to return 6

echo $ans;

CodePudding user response:

$lengths = array_map('strlen', $array);

Above line has only lengths of adjacent similar characters. array_search on max of those lengths will only yield the index where the maximum length is stored. It is totally unrelated with getting the index 6 of your string. If you still wish to get it, you will have to array_sum till that index to get the start index in the actual string.

Snippet:

<?php

$str = "abbcccddddcccbba";

$array = preg_split('/(.)(?!\1|$)\K/', $str);

$lengths = array_map('strlen', $array);

$maxLength = max($lengths);

array_splice($lengths,array_search($maxLength, $lengths));

$ans = array_sum($lengths);

echo $ans;

Online Demo


Alternate Solution:

I would write a simple for loop that uses 2 pointers to keep track of start index of similar characters and record the frequency and start index whenever it is greater than max frequency.

Snippet:

<?php

$str = "abbcccddddcccbba";

$len = strlen($str);

$maxF = 1;
$maxIdx = $startIdx = 0;

for($i = 1; $i < $len;   $i){
  if($str[ $i ] != $str[ $i - 1] || $i === $len - 1){
     if($str[ $i ] === $str[ $i - 1] && $i === $len - 1) $i  ;
     if($maxF < $i - $startIdx){
       $maxF = $i - $startIdx;
       $maxIdx = $startIdx;
     }
     $startIdx = $i;
  }
}

echo $maxIdx;

Online Demo

  • Related