Herhaling zoeken
0.237237237237237237237237
herhaling: 237
0.111111111111111111111111
herhaling: 1
enz.
Heeft iemand een idee hoe ik dit kan doen?
0.237237237237237237237237
Herhaling: 2, 3, 7, 23, 37, 237, 372, 723 en nog veel meer.
De herhaling die uit het grootste aantal tekens bestaat. Dus één van deze 237, 372, 723 (maakt niet uit welke)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?php
$string = 'cgfcgfcgfcgfcgfcgfcgfcgf';
function match_searchSubstring($string)
{
$string_length = strlen($string);
$results = array();
$k = 0;
for($i = 0; $i < $string_length; $i++)//voor ieder mogelijk begin
{
for($j = 2; $j < ($string_length-$j); $j++)
{
$results[$k]['substring'] = substr($string, $i, $j);
$results[$k]['hits'] = substr_count($string, $results[$k]['substring']);
$k++;
}
}
return $results;
}
function match_getResults($tests)
{
$tests_length = count($tests);
$best_test['hits'] = 0;
$best_test['substring'] = '';
for($i = 0; $i < $tests_length; $i++)
{
if($tests[$i]['hits'] > $best_test['hits'])
{
$best_test = $tests[$i];
}
elseif($tests[$i]['hits'] == $best_test['hits'] && strlen($tests[$i]['substring']) > strlen($best_test['substring']))
{
$best_test = $tests[$i];
}
}
return $best_test;
}
$results = match_searchSubstring($string);
print_r(match_getResults($results));
?>
$string = 'cgfcgfcgfcgfcgfcgfcgfcgf';
function match_searchSubstring($string)
{
$string_length = strlen($string);
$results = array();
$k = 0;
for($i = 0; $i < $string_length; $i++)//voor ieder mogelijk begin
{
for($j = 2; $j < ($string_length-$j); $j++)
{
$results[$k]['substring'] = substr($string, $i, $j);
$results[$k]['hits'] = substr_count($string, $results[$k]['substring']);
$k++;
}
}
return $results;
}
function match_getResults($tests)
{
$tests_length = count($tests);
$best_test['hits'] = 0;
$best_test['substring'] = '';
for($i = 0; $i < $tests_length; $i++)
{
if($tests[$i]['hits'] > $best_test['hits'])
{
$best_test = $tests[$i];
}
elseif($tests[$i]['hits'] == $best_test['hits'] && strlen($tests[$i]['substring']) > strlen($best_test['substring']))
{
$best_test = $tests[$i];
}
}
return $best_test;
}
$results = match_searchSubstring($string);
print_r(match_getResults($results));
?>
Uitkomst was 'Array ( [substring] => cgf [hits] => 8 )'
ik ga hem testen maar als die werk ben je GEWELDIG!!!!!
Mooi script zo jelmer, nu nog zorgen dat die ook van die logische wiskundige reeksen gaat herkennen en zegt wat het volgende getal is :P (zoals dat wel eens gaat bij IQ testen en dergelijke)
905123451234512345123451234512345123451234512345
invoer, dan zegt hij dat de herhaling '5' is maar dat moet '12345'. Hij moet dus zoeken naar de langste herhaling. Ik ben zelf ook even aan het proberen, maar zou je ook nog even willen kijken?
Alvast bedankt.
Eén opmerking. Als je dit hebt:
$string = 'cgfcgfcgfcgfcgfcgfcgfcgf';
Dan is de langst voorkomende herhaling niet 'cgf'
De string 'cgfcgfcgfcgf' komt twee maal voor en is dus de langste herhaling.
Het kan ook nog de langste herhaling zijn waarbinnen géén herhalingen voorkomen. Dan moet ccgfccgf als uitkomst cgf geven. Pfff, dat is nog niet zo gemakkelijk, maar misschien wel een leuke uitdagin voor het weekend.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Edit: Testspul verwijderd
Gewijzigd op 24/11/2005 19:42:00 door - SanThe -
Bij die van SanThe is dat zo te zien net andersom :)
Jelmer:
@Jan: Mijn idee was de langst mogelijke string die het vaakstg voorkomt, waar hoe vaker hij voorkomt belangrijker is dan de lengte.
Bij die van SanThe is dat zo te zien net andersom :)
Bij die van SanThe is dat zo te zien net andersom :)
Dat klopt ja.. je moet dit script niet gebruiken met een zin. Dan telt die de letter die het vaakst voorkomt!!!
Robert:
Dat klopt ja.. je moet dit script niet gebruiken met een zin. Dan telt die de letter die het vaakst voorkomt!!!
Jelmer:
(hier mijn lap tekst)
Dat klopt ja.. je moet dit script niet gebruiken met een zin. Dan telt die de letter die het vaakst voorkomt!!!
Daar had ik dat minimum van 2 voor bedacht. maar ik denk dat je dat wat moet opvoeren naar minimaal 3 in dat geval.
SanThe:
Edit: Testspul verwijderd
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Edit: Testspul verwijderd
Ook een mooi script SanThe! Ik snap de benadering ook, maar ik heb net even zitten testen ...
Stel ik vul als teststring in:
$test="abcabcdefgdefg";
dan lijkt mij dat er uit moet rollen 'defg', maar het script levert bij mij als resultaat 'abc'.
Jelmer:
Bij die van SanThe is dat zo te zien net andersom :)
Klopt, ben bezig het foutje er uit te halen.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?php
$test="abcabcdefgdefg";
$hlen=strlen($test);
$len=$hlen-1;
$mx=1;
$ln=0;
$lnh=0;
$tel=0;
$res="";
$gn=0;
for($i=1;$i<=$hlen;$i++)
{
$gn=$gn+$i;
}
function x($x)
{
global $test,$hlen,$len,$mx,$ln,$lnh,$res,$tel,$gn;
for($i=$x; $i<$hlen; $i++)
{
for($j=$i+1; $j<=$hlen; $j++)
{
$tel++;
if($tel>$gn)
{
return;
}
$cnt=substr_count($test, substr($test, $i, $hlen-$j+1));
$lnh=strlen(substr($test, $i, $hlen-$j+1));
if((($cnt>$mx) and ($lnh==$ln)) or (($lnh>$ln) and ($cnt>1)))
{
$res=substr($test, $i, $hlen-$j+1);
$mx=$cnt;
$ln=$lnh;
}
}
if($tel<=$gn)
{
$k=$i+1;
x($k);
}
}
}
x(0);
echo "De grootste substring komt " . $mx . " keer voor: " . $res . "<br />";
?>
$test="abcabcdefgdefg";
$hlen=strlen($test);
$len=$hlen-1;
$mx=1;
$ln=0;
$lnh=0;
$tel=0;
$res="";
$gn=0;
for($i=1;$i<=$hlen;$i++)
{
$gn=$gn+$i;
}
function x($x)
{
global $test,$hlen,$len,$mx,$ln,$lnh,$res,$tel,$gn;
for($i=$x; $i<$hlen; $i++)
{
for($j=$i+1; $j<=$hlen; $j++)
{
$tel++;
if($tel>$gn)
{
return;
}
$cnt=substr_count($test, substr($test, $i, $hlen-$j+1));
$lnh=strlen(substr($test, $i, $hlen-$j+1));
if((($cnt>$mx) and ($lnh==$ln)) or (($lnh>$ln) and ($cnt>1)))
{
$res=substr($test, $i, $hlen-$j+1);
$mx=$cnt;
$ln=$lnh;
}
}
if($tel<=$gn)
{
$k=$i+1;
x($k);
}
}
}
x(0);
echo "De grootste substring komt " . $mx . " keer voor: " . $res . "<br />";
?>
@ SanThe: die levert inderdaad de goede uitkomst. Knap gedaan!
Ik heb hem net even getest met 'abcabcdefgdefgcdefgdefg' en dan geeft hij ook de goede uitkomst (cdefgdefg).
'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
geeft hij twee keer de helft van die string. En dat klopt, want als hij de hele string terug zou geven, was er geen sprake van een patroon. Petje af, SanThe :-)