Przeszukiwanie stringa

0

Witam,

Mam sobie takiego stringa test example samples testy.

Muszę znaleźć słowo, które ma największą liczbę wystąpień tej samej litery.
W tym przypadku będzie to example, ponieważ e występuje najwięcej razy w tym słowie.

Użyć funkcji wbudowanych w php? Wyrażeni regularnych czy napisać swój algorytm?

Dziel i rządź? Jaka jest waszym zdaniem najbardziej optymalny pomysł.

0

Dlaczego nie słowo 'test', które zawiera dwukrotnie literę 't'?

0

Wytłumacz proszę w jaki sposób chciałbyś tutaj wykorzystać wyrażenia regularne? :|

explode, liczenie liczby liter w każdym wyrazie i porównywanie.

0

Ja podzieliłem cały string explode przez spację. Następnie każdy pojedynczy string tj. test wrzuciłem do pętli for, ponieważ string to nic innego jak tablica pojedynczych liter. Następnie biorę pierwszą literę sprawdzam ile razy wystąpiła w cały stringu (test) i usuwam, żeby pętla mogła chodzić szybciej i pomijała już zliczone znaki. Jak myślicie ok? Czy do kitu?

0

KOSZ :)

1
Patryk27 napisał(a):

Wytłumacz proszę w jaki sposób chciałbyś tutaj wykorzystać wyrażenia regularne? :|

explode, liczenie liczby liter w każdym wyrazie i porównywanie.

Nie chciało mi się tłumaczyć, ale proszę bardzo. Co prawda troszkę nagmatwałem preg_callbackiem bo mogłem bezprośrednio na match_all zrobić, i appendować do nowej tablicy wyniki, bez potrzeby kodowania do jsona, ale nie chciało mi się poprawiać, odpowiedź masz. A explode na spacje to '|([^\s]+)|',

<?php
	echo '<pre>';
	$string = 'test example sampless testy';
	$line = preg_replace_callback(
        '|([^\s]+)|',
        function ($matches) {
			$longest = 0;
			$slowo = '';
			$litera = '';
			foreach (range('A', 'Z') as $char) {
				preg_match_all('/('.$char.')/isu',$matches[1],$wynik);
				$actualLong = count($wynik[0]);
				if($actualLong > $longest){
					$longest = $actualLong;
					$slowo = $matches[1];
					$litera = $char;
				}
			}		
			
			return '{"slowo": "'.$slowo.'", "dlugosc": '.$longest.',"litera":"'.$litera.'"},';
        },
        $string
    );
	$wyniki =json_decode('['.rtrim($line, ",").']',true);
	$najwiecejPowtorzen = 0;
	$wynik = '';
	for($i = 0; $i < count($wyniki);$i++){
		if($wyniki[$i]['dlugosc'] > $najwiecejPowtorzen){
			$najwiecejPowtorzen = $wyniki[$i]['dlugosc'];
			$wynik = $wyniki[$i];
		}
	}
	var_dump($wynik);
?>	
array(3) {
  ["slowo"]=>
  string(8) "sampless"
  ["dlugosc"]=>
  int(3)
  ["litera"]=>
  string(1) "S"
}

Po lekkim refactorze dla tych co mają problemy...

<?php
  echo '<pre>';
  var_dump(findRepeartingCharsInWord('test example sampless testy'));
  function findRepeartingCharsInWord($aString)
    {
	$words = explode(' ',$aString);
	$words = array_unique($words);
	
	$repeartCount = 0;
	$foundWord = '';
	$char = '';
	
	foreach($words as $word)
	  {
	  foreach (range('A', 'Z') as $matchingChar)
	    {
		preg_match_all('/('.$matchingChar.')/isu',$word,$foundedRepeartedCharsInWord);
		$numberOfRepeartedCharInWord = count($foundedRepeartedCharsInWord[0]);
		
		if($numberOfRepeartedCharInWord > $repeartCount)
		  {
		  $repeartCount = $numberOfRepeartedCharInWord;
		  $foundWord = $word;
		  $matchedChar = $matchingChar;
		  }
		
	    }
	  }
	return array
	  (
	  'foundWord' => $foundWord,
	  'RepeartCount' => $repeartCount,
	  'matchedChar' => $matchedChar
	  );
    }
?>    
0

Będę solidarny z resztą ekipą i wrzucę swój kod. Czekam na szczerą-ostrą krytykę.

function search($sData)
{
        $sResult = $sWordTmp = '';
        $iMax = $iRes = 0;
        $sData = preg_replace('/[^a-z ]/i', '', $sData);
        $aData = explode(' ', $sData);
        $aData = array_unique($aData);

        foreach($aData as $sWord)
        {
            $sWordTmp = $sWord;
            while(strlen($sWordTmp) > $iRes)
            {
                $iWordLength = strlen($sWordTmp);
                $sWordTmp = strtolower($sWordTmp);
                $iCountLetter = 0;
                for($i = 0; $i < $iWordLength; $i++)
                {
                    if($sWordTmp[0] === $sWordTmp[$i])
                        $iCountLetter++;
                }

                if($iRes < $iCountLetter)
                    a$iRes = $iCountLetter;

                $sWordTmp = str_replace($sWordTmp[0], '', $sWordTmp);
            }

            if ($iMax < $iRes)
            {
                $sResult = $sWord;
                $iMax = $iRes;
            }
        }

        print_r( $sResult );
        print_r( $iMax );

    }
}
 
1

Powiedz mi co oznacza prefiks przed zmiennymi a,i,s i jakie jest rozwinięcie skrótu Tmp? Skąd programista czytający kod ma wiedzieć o co ci chodziło? Ogólnie popracuj nad nazewnictwem zmiennych, tak aby każdy inny programista mógł się doczytać(od razu zaznaczam że też nie jestem idealny i sam jak czytam własny kod to mnie szlag trafia, lecz poprawne nazewnictwo nie jest łatwe do nauczenia, a dzięki niemu, wydajność pisania kodu nie będzie drastycznie spadać).
$aData = explode(' ', $sData); //zmienne powinny być rozróżnialne
user image
Jeżeli wiążesz jakąś karierę z programowaniem to musisz przeczytać książkę czysty kod.

0

http://pl.wikipedia.org/wiki/Notacja_w%C4%99gierska

Nie używam zbyt często Hungarian notation, ale warto chyba znać?

Zmienna $sWordTmp jest kopią zmiennej $sWord typu string. W pętli while obrabiamy, zmienną tmp. Czyli usuwamy, literki, które już sprawdziliśmy, ażeby uniknąć porównania literek, które już wcześniej zliczyliśmy np test.

1 wywołanie pętli while:
test
2 es
3 s
koniec pętli. I w tym momenice $sWordTmp = s, a $sWord = 'test';.

...fakt, nazewnictwo mam z d**y.

1 użytkowników online, w tym zalogowanych: 0, gości: 1