2016-03-17 3 views
2

Необходимо написать блок кода, проверка которого является одной строкой, является поворот другой.PHP - Проверьте, является ли строка поворот другой строки

Посмотрел на множество сообщений здесь, и все это на Java или C++, но мне нужно сделать это на PHP.

Я пытался несколько различных вещей, пытаясь работать с C++ и примеры Java, но я, не имея каких-либо удачи, вот мой текущий код:

<?php 

function isSubstring($s1, $s2) { 


    if(strlen($s1) != strlen($s2)) { 
     return false; 
    } 

    if(WHAT TO PUT HERE) { 
     echo "it is!"; 
    } else { 
     echo "nope"; 
    } 
} 


isSubstring("hello", "helol"); 

?> 
+0

Просто проверьте, если все символы одной строки в другую. Или сортируйте символы и проверьте, совпадают ли они. –

+0

Я бы сортировал обе строки (в алфавитном порядке), а затем сравнивал. http://stackoverflow.com/questions/9912469/php-how-to-sort-the-characters-in-a-string –

+0

Используйте strrev, он будет делать именно то, что вы хотите –

ответ

4

Я хотел бы пойти на что-то вроде этого:

function isSubstring($s1, $s2) 
{ 
    // If the strings match exactly then no need to proceed 
    if($s1 === $s2) 
    { 
     echo "it is!"; 
     return; 
    } 
    elseif(strlen($s1) !== strlen($s2)) 
    { 
     // Strings must be of equal length or else no need to proceed 
     echo "nope"; 
     return; 
    } 

    // Put each character into an array 
    $s1 = str_split($s1); 
    $s2 = str_split($s2); 

    // Sort alphabetically based on value 
    sort($s1); 
    sort($s2); 

    // Triple check the arrays against one-another 
    if($s1 === $s2) 
    { 
     echo "it is!"; 
    } 
    else 
    { 
     echo "nope"; 
    } 
} 
+0

Что означает «одно ... вращение другого»? Я бы интерпретировал «ротацию», чтобы обозначать одни и те же персонажи, но менялся. Те, кто падает с конца, начинают свое начало. 'ABCDEF' и' DEFABC' или 'FABCDE '. Ответ проверяется только в том случае, если они были перетасованы. – BryanT

+0

@BryanT Это вопрос, который вы должны задать OP, но в любом случае на основе OP 'isSubstring (« hello »,« helol »);« Например, я предполагал, что слово «вращение» не следует воспринимать буквально и что OP просто хочет проверить две строки и посмотреть, совпадают ли все их символы независимо от порядка. Согласно принятию OP моего ответа, я смело полагаю, что моя догадка верна. Может быть, «поворот» можно заменить «комбинацией» в формулировке OP? – MonkeyZeus

+0

Теперь я вижу его тестовые строки (пропустил это). Имя функции 'isSubstring' также вводит в заблуждение. – BryanT

-2

Я бы сортировал символы в строках, создавая массив, а затем снова вставляя их в строку.

if (sort(str_split($s1)) == sort(str_split($s2))) { 

Это сделало бы трюк в одной строке.

Редактировать: Спасибо Не паникуйте, отредактировал мой ответ!

+2

Не нужно взрывать; массивы сопоставимы. –

+3

['sort()'] (http://php.net/manual/en/function.sort.php) принимает массив по ссылке и возвращает логическое значение. – MonkeyZeus

0

Вы могли бы разделить каждую строку и сортировать его, как это:

$split1 = unpack("C*",$s1); 
asort($split1); 

Затем вы можете пройти как массивы, сравнивающие значения.

3

Много способов. Вот еще один, используя встроенную функцию count_chars на обеих строках, а затем сравнивая обе полученные массивы:

function isSubstring($s1, $s2) { 
    if (strlen($s1) != strlen($s2)) { 
     echo "nope"; 
     return; 
    } 

    $s1cnt = count_chars($s1, 1); 
    $s2cnt = count_chars($s2, 1); 

    if($s1cnt === $s2cnt) { 
     echo "it is!"; 
    } else { 
     echo "nope"; 
    } 
} 

Edit: в MonkeyZeus отметил, остерегайтесь сравнения с многобайтовых символов. Он может укусить немного:

isSubstring('crढap', 'paࢤrc'); 

даст true как ответ. ढ является UTF-8 indian devanagari с тремя байтами: E0 A2 A4 и ࢤ также являются тремя байтовыми символами (арабский): E0 A4 A2, а функция count_chars подсчитывает отдельные байты. Таким образом, было бы безопасно использовать, если символы относятся только к одному языку, а также получить некоторые таблетки для головной боли ...

Мне кажется, что для управления такими вещами нам нужны символы, которые состоят из 3 байтов.

+1

Это впечатляет, мне это нравится :) – MonkeyZeus

+1

Интересно, будет ли это проявлять странное поведение при использовании таких вещей, как 'count_chars ('Ýô', 1);' – MonkeyZeus

+0

@MonkeyZeus Хороший вопрос, который вы задали. Из руководства учитываются индивидуальные байты, а многобайтовые символы не учитываются как таковые, но учитываются их составляющие байты. Возвращаемый массив с режимом '0' вместо' 1' будет массивом из 256 значений, индексированных от 0 до 255. Поэтому я вполне уверен, что он не должен ломаться с многобайтовыми символами. Но кто знает! Быстрые короткие и грязные тесты, выполненные с французскими словами с акцентами, были успешными. – Zimmi

0

Основываясь на примере, который вы указали, это похоже на то, что вы называете «поворот», на самом деле может быть «anagram».

Множество ответов уже здесь показывают, что существует много разных способов сделать это. Просто для удовольствия, вот еще один метод, используя string accessing by character (следовательно, это не многобайтовый сейф).

function anagramDiff($a, $b) { 
    $diff = []; 
    foreach ([$a, $b] as $x) { 
     $c = isset($c) ? -1 : 1; 
     for ($i = 0; $i < strlen($x); $i++) { 
      isset($diff[$x[$i]]) ? $diff[$x[$i]] += $c : $diff[$x[$i]] = $c; 
     } 
    } 
    return array_filter($diff); 
} 

Это итерация по каждой строке и создает массив различий между количеством символов, содержащихся в каждой строке. Он увеличивает для первой строки и декременты для второй строки, поэтому она заканчивается положительными числами для символов, найденных в первой строке, без количества во втором и отрицательных чисел для наоборот.

Если вы просто хотите использовать его, чтобы увидеть, является ли одна строка анаграммой другой, anagramDiff('hello', 'helol') вернет пустой массив (который будет оцениваться как false), потому что нет различий.

Но вы также можете использовать его, чтобы узнать, каковы различия на самом деле, например.

anagramDiff('hello', 'jello'); // returns ['h' => 1, 'j' => -1] 
anagramDiff('hello', 'lololol') // returns ['h' => 1, 'e' => 1, 'o' => -2, 'l' => -2] 
0
<?php 
function isRotationalString($str1,$str2){ 
    $len = strlen($str1); 
    if($str1 === $str2){ 
     return true; 
    }else{ 
     if($len == strlen($str2)){ 
      $flag = true; 
      for($i=0;$i<$len;$i++){ 
       if($str1[0]==$str2[$i]){ 
        $tst = $i;$start = true;break; 
       } 
      } 
      if($start){ 
       for($j=0;$j<$len;$j++){ 
        $m = $j+$tst; 
        if($m < $len){ 
         if($str1[$j] != $str2[$m]){ 
          $flag = false;break; 
         } 
        }else{ 
         if($m>=$len) 
         { 
          $k = $m - $len; 
          if($str1[$j] != $str2[$k]){ 
           $flag = false;break; 
          } 
         } 
        }  
       } 
      }else{ 
       $flag = false; 
      } 
      return $flag; 
     } 
    } 
} 
echo isRotationalString("abcd","bcda")?'It is':'It is not'; 
?> 

выше скрипт проверит строка является ли вращение другой строки или нет?
isRotationalString ("ABCD", "BCDA") => Это
isRotationalString ("ABCD", "CBDA") => Не

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