<?php
//* Find minimal distance between two given symbols symbols in given string
$string = "j8QSid5j558mQgcRcwmYDH8wVLlI1irwLs0r5Ufx";
$symbol1 = "e";
$symbol2 = "t";
print_r ("\nMinimal distance is " . findMinDistance
($string, $symbol1, $symbol2) . "\n");
function findMinDistance($string, $symbol1, $symbol2) {
$curr_pos1 = strpos($string, $symbol1, 0); if ($curr_pos1 === false ) {return false;}
else {echo "First entry of " . $symbol1 . " is " . $curr_pos1 . "\n";}
$curr_pos2 = strpos($string, $symbol2, 0); if ($curr_pos2 === false ) {return false;}
else {echo "First entry of " . $symbol2 . " is " . $curr_pos2 . "\n";}
if ($curr_pos1 < $curr_pos2) {$curr_pos = $curr_pos1; $symbol = $symbol2;}
else {$curr_pos = $curr_pos2; $symbol = $symbol1;}
$next_pos = strpos($string, $symbol, $curr_pos+1); if ($next_pos === false ) {return false;}
else {echo "Next entry of " . $symbol . " is " . $next_pos . "\n";}
$min_distance = $next_pos - $curr_pos;
echo "Distance is " . $min_distance . "\n";
$curr_distance = findNextDistance($string, $curr_pos, $symbol, $min_distance, $symbol1, $symbol2);
return --$min_distance;
}
function findNextDistance($string, &$curr_pos, $symbol, &$min_distance, $symbol1, $symbol2) {
echo "Looking forward for " . $symbol . " from pos " . $curr_pos . ". ";
$pos = strpos($string, $symbol, $curr_pos+1); if ($pos === false ) {return false;}
$symbol == $symbol1 ? $prev_symbol = $symbol2 : $prev_symbol = $symbol1;
$second_accurance_pos = strpos($string, $prev_symbol, $curr_pos+1); if ($second_accurance_pos < $pos && $second_accurance_pos != false) {
echo "*** Double accurance of " . $prev_symbol . " at pos " . $second_accurance_pos . "\n";
$curr_pos = $second_accurance_pos;
findNextDistance($string, $curr_pos, $symbol, $min_distance, $symbol1, $symbol2); return true;
}
$curr_distance = $pos - $curr_pos;
echo "Got it at pos " . $pos . ", distance " . $curr_distance . "\n";
if ($curr_distance < $min_distance) {$min_distance = $curr_distance;}
$curr_pos = $pos;
$symbol == $symbol1 ? $symbol = $symbol2 : $symbol = $symbol1;
//echo "symbol1: " . $symbol1 ." symbol2: " . $symbol2 . " symbol: " . $symbol . "\n";
findNextDistance($string, $curr_pos, $symbol, $min_distance, $symbol1, $symbol2);
}
PD9waHAKCi8vKiBGaW5kIG1pbmltYWwgZGlzdGFuY2UgYmV0d2VlbiB0d28gZ2l2ZW4gc3ltYm9scyBzeW1ib2xzIGluIGdpdmVuIHN0cmluZwoKJHN0cmluZyA9ICJqOFFTaWQ1ajU1OG1RZ2NSY3dtWURIOHdWTGxJMWlyd0xzMHI1VWZ4IjsKJHN5bWJvbDEgPSAiZSI7CiRzeW1ib2wyID0gInQiOwoKcHJpbnRfciAoIlxuTWluaW1hbCBkaXN0YW5jZSBpcyAiIC4gZmluZE1pbkRpc3RhbmNlKCRzdHJpbmcsICRzeW1ib2wxLCAkc3ltYm9sMikgLiAiXG4iKTsKCmZ1bmN0aW9uIGZpbmRNaW5EaXN0YW5jZSgkc3RyaW5nLCAkc3ltYm9sMSwgJHN5bWJvbDIpIHsKCgkkY3Vycl9wb3MxID0gc3RycG9zKCRzdHJpbmcsICRzeW1ib2wxLCAwKTsKCWlmICgkY3Vycl9wb3MxID09PSBmYWxzZSApIHtyZXR1cm4gZmFsc2U7fQoJCWVsc2Uge2VjaG8gIkZpcnN0IGVudHJ5IG9mICIgLiAkc3ltYm9sMSAuICIgaXMgIiAuICRjdXJyX3BvczEgLiAiXG4iO30KCgkkY3Vycl9wb3MyID0gc3RycG9zKCRzdHJpbmcsICRzeW1ib2wyLCAwKTsKCWlmICgkY3Vycl9wb3MyID09PSBmYWxzZSApIHtyZXR1cm4gZmFsc2U7fQoJCWVsc2Uge2VjaG8gIkZpcnN0IGVudHJ5IG9mICIgLiAkc3ltYm9sMiAuICIgaXMgIiAuICRjdXJyX3BvczIgLiAiXG4iO30KCglpZiAoJGN1cnJfcG9zMSA8ICRjdXJyX3BvczIpIHskY3Vycl9wb3MgPSAkY3Vycl9wb3MxOyAkc3ltYm9sID0gJHN5bWJvbDI7fQoJCWVsc2UgeyRjdXJyX3BvcyA9ICRjdXJyX3BvczI7ICRzeW1ib2wgPSAkc3ltYm9sMTt9CgoJJG5leHRfcG9zID0gc3RycG9zKCRzdHJpbmcsICRzeW1ib2wsICRjdXJyX3BvcysxKTsKCWlmICgkbmV4dF9wb3MgPT09IGZhbHNlICkge3JldHVybiBmYWxzZTt9CgkJZWxzZSB7ZWNobyAiTmV4dCBlbnRyeSBvZiAiIC4gJHN5bWJvbCAuICIgaXMgIiAuICRuZXh0X3BvcyAuICJcbiI7fQoKCSRtaW5fZGlzdGFuY2UgPSAkbmV4dF9wb3MgLSAkY3Vycl9wb3M7CgkJZWNobyAiRGlzdGFuY2UgaXMgIiAuICRtaW5fZGlzdGFuY2UgLiAiXG4iOwoKCSRjdXJyX2Rpc3RhbmNlID0gZmluZE5leHREaXN0YW5jZSgkc3RyaW5nLCAkY3Vycl9wb3MsICRzeW1ib2wsICRtaW5fZGlzdGFuY2UsICRzeW1ib2wxLCAkc3ltYm9sMik7CgoJcmV0dXJuIC0tJG1pbl9kaXN0YW5jZTsKfQoKZnVuY3Rpb24gZmluZE5leHREaXN0YW5jZSgkc3RyaW5nLCAmJGN1cnJfcG9zLCAkc3ltYm9sLCAmJG1pbl9kaXN0YW5jZSwgJHN5bWJvbDEsICRzeW1ib2wyKSB7CgllY2hvICJMb29raW5nIGZvcndhcmQgZm9yICIgLiAkc3ltYm9sIC4gIiBmcm9tIHBvcyAiIC4gJGN1cnJfcG9zIC4gIi4gIjsKCSRwb3MgPSBzdHJwb3MoJHN0cmluZywgJHN5bWJvbCwgJGN1cnJfcG9zKzEpOwoJaWYgKCRwb3MgPT09IGZhbHNlICkge3JldHVybiBmYWxzZTt9CgoJJHN5bWJvbCA9PSAkc3ltYm9sMSA/ICRwcmV2X3N5bWJvbCA9ICRzeW1ib2wyIDogJHByZXZfc3ltYm9sID0gJHN5bWJvbDE7Cgkkc2Vjb25kX2FjY3VyYW5jZV9wb3MgPSBzdHJwb3MoJHN0cmluZywgJHByZXZfc3ltYm9sLCAkY3Vycl9wb3MrMSk7CglpZiAoJHNlY29uZF9hY2N1cmFuY2VfcG9zIDwgJHBvcyAmJiAkc2Vjb25kX2FjY3VyYW5jZV9wb3MgIT0gZmFsc2UpIHsKCQllY2hvICIqKiogRG91YmxlIGFjY3VyYW5jZSBvZiAiIC4gJHByZXZfc3ltYm9sIC4gIiBhdCBwb3MgIiAuICRzZWNvbmRfYWNjdXJhbmNlX3BvcyAuICJcbiI7CgkJJGN1cnJfcG9zID0gJHNlY29uZF9hY2N1cmFuY2VfcG9zOwoJCWZpbmROZXh0RGlzdGFuY2UoJHN0cmluZywgJGN1cnJfcG9zLCAkc3ltYm9sLCAkbWluX2Rpc3RhbmNlLCAkc3ltYm9sMSwgJHN5bWJvbDIpOyByZXR1cm4gdHJ1ZTsKCX0KCgkkY3Vycl9kaXN0YW5jZSA9ICRwb3MgLSAkY3Vycl9wb3M7CgllY2hvICJHb3QgaXQgYXQgcG9zICIgLiAkcG9zIC4gIiwgZGlzdGFuY2UgIiAuICRjdXJyX2Rpc3RhbmNlIC4gIlxuIjsKCWlmICgkY3Vycl9kaXN0YW5jZSA8ICRtaW5fZGlzdGFuY2UpIHskbWluX2Rpc3RhbmNlID0gJGN1cnJfZGlzdGFuY2U7fQoKCSRjdXJyX3BvcyA9ICRwb3M7IAoJJHN5bWJvbCA9PSAkc3ltYm9sMSA/ICRzeW1ib2wgPSAkc3ltYm9sMiA6ICRzeW1ib2wgPSAkc3ltYm9sMTsKCS8vZWNobyAic3ltYm9sMTogIiAuICRzeW1ib2wxIC4iIHN5bWJvbDI6ICIgLiAkc3ltYm9sMiAuICIgc3ltYm9sOiAiIC4gJHN5bWJvbCAuICJcbiI7CglmaW5kTmV4dERpc3RhbmNlKCRzdHJpbmcsICRjdXJyX3BvcywgJHN5bWJvbCwgJG1pbl9kaXN0YW5jZSwgJHN5bWJvbDEsICRzeW1ib2wyKTsKfQoK