|
|
|
| Помогите найти подстроку без использования встроенных функций обработки строк. | |
|
|
|
|
|
|
|
для: technic611
(16.05.2012 в 20:23)
| | каких именно? если всех, то тупо циклом перебираешь, алгоритм http://ru.wikipedia.org/wiki/Алгоритм_Кнута_—_Морриса_—_Пратта http://algolist.manual.ru/search/esearch/kmp.php | |
|
|
|
|
|
|
|
для: Красная_шляпа
(16.05.2012 в 22:26)
| | я думаю нужно написать подобие функций strpos и strlen. Вы пример дали это что вообще? | |
|
|
|
|
|
|
|
для: technic611
(16.05.2012 в 22:31)
| | http://ru.wikibooks.org/wiki/Примеры_реализации_алгоритма_Кнута_—_Морриса_—_Пратта решение твоей задачи, на php перепиши и всё | |
|
|
|
|
|
|
|
для: Красная_шляпа
(16.05.2012 в 22:56)
| | strlen нельзя применять и все строковые функции | |
|
|
|
|
|
|
|
для: technic611
(16.05.2012 в 23:20)
| | те дали алгоритм сиди разбирай, не тупи | |
|
|
|
|
|
|
|
для: Красная_шляпа
(16.05.2012 в 23:44)
| | в примерах присутствует функция strlen () | |
|
|
|
|
|
|
|
для: technic611
(17.05.2012 в 00:02)
| |
<?
$str = 'string';
$i = 0;
$cmp = 'r';
$pos = -1;
while(@$str[$i]) {
if($str[$i]==$cmp && $pos<0) $pos = $i;
$i++;
}
echo $pos;
|
Добавляйте проход по $cmp, сравнивая ее индексы и корректируя $pos. | |
|
|
|
|
|
|
|
для: confirm
(17.05.2012 в 00:07)
| | а если искать "ri" работать не будет | |
|
|
|
|
|
|
|
для: technic611
(17.05.2012 в 12:03)
| | Все будет, если дописать условия. Во-первых нужно добавить счетчик для вхождения которое ищем. Во-вторых - увеличивать его, если найдено совпадение для него, и сбрасывать если следующее сравнение ложное. В третьих - соответственно этим условиям сбрасывать позицию. Что-то типа такого. Думайте, вам ведь надо. | |
|
|
|
|
|
|
|
для: confirm
(17.05.2012 в 12:14)
| | спасибо. сделал так.
подскажите, как сделать проверку если между строк тире, запятая. как создать массив и его просканить
<?
function search($str, $cmp)
{
$i = 0;
$pos = -1;
$vhod=0;
while(@$str[$i]) {
if($str[$i]==$cmp[0] && $pos<$vhod)
{
$pos = $i;
$k=$i;
while(@$cmp[$k])
{
if($cmp[$k]==true || $cmp[$k]==" ")
{
if($str[$pos+$k]==$cmp[$k]) $pos = $pos;
else $vhod=$pos+1;
}
$k++;
}
}
$i++;
}
echo "Подстрока найдена на позиции: $pos";
}
$str = 'irrirgyyyihoiirrgyu ytrew';
$cmp = 'trew';
search ($str, $cmp);
?>
|
| |
|
|
|
|
|
|
|
для: technic611
(17.05.2012 в 17:00)
| | Как вы такой код читаете, все по левому краю и отступов ноль? )
В смысле точка, запятая... не учитывать или просто проверять? Опять не используя строковых функций?
Массив чего? | |
|
|
|
|
|
|
|
для: confirm
(17.05.2012 в 17:06)
| | в блокноте писал.
массив такой проверка вместо этого
if($cmp[$k]==true || $cmp[$k]==" ")
|
масив можно прогнать и проверить на разделители строк, только как? и что скажете насчет кода, правильный он или нет... | |
|
|
|
|
|
|
|
для: technic611
(17.05.2012 в 17:44)
| | Не запускал вашего кода я, я его даже прочесть не могу, не знаю где остановка )
Проверьте его в всех ситуациях, вот и ответ будет, правильный он или нет.
Если сверять с тем, что в массиве, тогда достаточно in_array(). Вот только что-то я не пойму - эти символы такие же равноценные как и абвгд..., и если они участвуют в поиске, то зачем их выделять особо? Если не участвуют, то тогда я смысла поиска не понимаю. | |
|
|
|
|
|
|
|
для: confirm
(17.05.2012 в 18:16)
| | ой да, действительно, достаточно проверки на пробел ))) | |
|
|
|
|
|
|
|
для: technic611
(17.05.2012 в 12:03)
| |
<?php
$search = '611';
$haystack = 'technic611 - ololol xddd lolka';
$pos = false;
$i = 0;
while (@$c = $haystack[$i]) {
if ($c == $search[0]) {
$pos = $i;
$j = 0;
$k = 1;
while (@$c1 = $search[++$j]) {
if ($c1 == $haystack[++$i]) {
++$k;
}
}
if ($j == $k) {
break;
}
$pos = false;
}
++$i;
}
if ($pos === false) {
echo 'Ne naideno';
}
else {
echo 'Stroka do iskomoi podstroki: ' . substr($haystack, 0, $pos);
}
?>
|
тебе решение написали ниже, не уж то нельзя чуть-чуть доделать? | |
|
|
|
|
|
|
|
для: technic611
(17.05.2012 в 00:02)
| | строка в пэхэпэ тож самое что и массив! По ней также можно циклом прохадиться и т.д. strlen == count | |
|
|
|
|
|
|
|
для: Красная_шляпа
(17.05.2012 в 01:15)
| | Вы так думаете? | |
|
|
|
|
|
|
|
для: confirm
(17.05.2012 в 01:17)
| | я думаю, что я ничо не думаю | |
|
|
|
|
|
|
|
для: Красная_шляпа
(17.05.2012 в 01:41)
| | Строка никогда не была и не будет массивом, можно обращаться к элементам строки по индексу (смещению), но это не значит, что она массив. А поэтому, не являясь таковым, а также объектом, и переданная в качестве аргумента в функцию count, будет возвращать всегда 1. | |
|
|
|
|
|
|
|
для: technic611
(17.05.2012 в 00:02)
| |
<?php
$search = str_split('olk');
$haystack = str_split('technic611 - ololol xddd lolka');
$l1 = count($haystack);
$l2 = count($search);
$pos = false;
for ($i = 0; $i < $l1; ++$i) {
if ($haystack[$i] == $search[0]) {
$pos = $i;
$k = 0;
while (++$k < $l2) {
if ($haystack[++$i] != $search[$k]) {
break;
}
}
if ($k == $l2) {
break;
}
$pos = false;
}
}
if ($pos) {
echo 'Stroka do iskomoi podstroki: ' . implode(array_slice($haystack, 0, $pos));
}
else {
echo 'Ne naideno';
}
echo '<br><br><br><br>';
?>
|
| |
|
|
|
|
|
|
|
для: Красная_шляпа
(17.05.2012 в 01:42)
| | Товарищ упоминал, что никаких функций работы со строками нельзя применять. | |
|
|
|
|
|
|
|
для: confirm
(17.05.2012 в 01:45)
| | дооо с собачками сделает | |
|
|
|