2015-08-18 6 views
-1

У меня есть строка, которая является случайной в природе примером CBLBTTCCBB. Моя цель - подсчитать появление строки CTLBT в строке CBLBTTCCBB. Повторение букв, используемых для проверки, не допускается. Например, после формирования CTLBT оставшиеся случайные буквы для следующей итерации будут BCCB.Извлечение подстроки из строки случайных букв

Сценарий состоит в том, что у нас есть скретч-карта, где пользователи могут выигрывать буквы, чтобы сформировать слово CTLBT. На основе записей пользователя письма, которые он выиграл, находятся в строке CBLBTTCCBB, которая упорядочена слева направо на основании покупки скретч-карты.

Я думал об использовании strpos, но это кажется неуместным, поскольку он использует точное расположение подстроки из большей строки.

Любые мысли о том, как это решить?

Спасибо!

Примечание: Вопрос не является дубликатом How to count the number of occurrences of a substring in a string?, так как решение опубликовано в данной ссылке другое. substr_count подсчитывает появление подстроки из строки, предполагающей, что строка находится в правильном порядке, в котором будет сформирована подстрока.

+2

ли вы попробовать http://php.net/manual/en/function.substr-count.php ? –

+0

@DevDonkey До сих пор я все еще собираю свои мысли по этому вопросу. Я думал о том, чтобы зацикливать всю строку, но я думаю, что это будет неэффективно. – Jhn

+0

@VladimirGilevich Tried substr_count, но он не учитывает случайность стога сена. Моя цель - получить появление целевой строки, которая сформирована из случайной строки. – Jhn

ответ

1

Если я правильно понял, я хотел бы сделать это (с отпечатками для показа результатов):

<? 
# The string to test 
$string="CBLBTTCCBBTLTCC"; 
# The winning word 
$word="CTLBT"; 

# Get the letters from the word to use them as unique array keys 
$letters=array_unique(str_split($word)); 
print("Letters needed are:\n".print_r($letters,1)."\n"); 

# Initialize the work array 
$match=array("count" => array(),"length"=> array()); 
# Iterate over the keys to build the array with the number of time the letter is occuring 
foreach ($letters as $letter) { 
    $match['length'][$letter] = substr_count($word,$letter); #Number of time this letter appears in the winning word 
    $match['count'][$letter] = floor(substr_count($string,$letter)/$match['length'][$letter]); # count the letter (will be 0 if none present) and divide by the number of time it should appear, floor it so we have integer 

} 
print("Count of each letter divided by their appearance times:\n".print_r($match['count'],1)."\n"); 

# Get the minimum of all letter to know the number of times we can make the winning word 
$wins = min($match['count']); 
# And print the result 
print("Wins: $wins\n"); 
?> 

выход которым:

Letters needed are: 
Array 
(
    [0] => C 
    [1] => T 
    [2] => L 
    [3] => B 
) 

Count of each letter divided by their appearance times: 
Array 
(
    [C] => 5 
    [T] => 2 
    [L] => 2 
    [B] => 4 
) 

Wins: 2 

Как вы хотите, чтобы сосчитать комбинацию, независимо от того, минимальным количеством букв будет количество раз, когда пользователь выиграет, если одна буква отсутствует, это будет 0.

Я позволю вам превратить это в функцию и очистить линию печати эс вы не хотите;)

+0

Спасибо @ Tensibai!Я постараюсь реализовать тот, который вы предложили как лучший вариант. – Jhn

+0

@jhn сообщите мне, что у меня было короткое время прямо сейчас, у меня будет больше времени, чтобы улучшить его позже в тот же день – Tensibai

+0

@Jhn Answer улучшил, дайте мне знать если что-то неясно. – Tensibai

2

Вероятно тогда вместо StrPos вы можете использовать preg_replace тогда:

function rand_substr_count($haystack, $needle) 
{ 
    $result = $haystack; 

    for($i=0; $i<strlen($needle); $i++) { 
     $result = preg_replace('/'.$needle[$i].'/', '', $result, 1); 
    } 

    if (strlen($haystack) - strlen($result) == strlen($needle)) { 
     return 1 + rand_substr_count($result, $needle); 
    } else { 
     return 0; 
    } 
} 

echo rand_substr_count("CBLBTTCCBB", "CTLBT"); 
+0

OP хочет знать, сколько раз поиск присутствует (если кто-то выиграл дважды или более раз) – Tensibai

+0

@Tensibai благодарит за заметку! - перемещенный код в функцию - теперь его легко использовать для подсчета. –

+0

Хорошее использование рекурсивной функции :) Могу ли я спросить, почему 'preg_replace', а не' str_replace' для замены одной буквы? (IIRC это быстрее, но я могу ошибаться) – Tensibai

Смежные вопросы