PHP - 检查字符串是否是另一个字符串的旋转

时间:2016-03-17 17:49:06

标签: php string

需要编写一个代码块,检查是一个字符串是另一个字符串的旋转。

看看这里的大量帖子,它们都是Java或C ++,但我需要用PHP来完成。

我尝试了一些不同的东西,尝试使用C ++和Java示例,但我没有运气,这是我目前的代码:

var express = require('express');
var router = express.Router();
var myModule = require("myModule");

myModule.create().generateModel().then(tagger => {

    router.post('/tag', function(req, res, next) {
        res.json(tagger.tag(req.body.text));
    });

   module.exports = router;
});

7 个答案:

答案 0 :(得分:4)

有很多方法可供选择。这里还有一个在两个字符串上使用内置函数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";
    }
}

编辑:正如MonkeyZeus指出的那样,请注意与多字节字符的比较。它可能会咬一点:

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

true作为答案。 ढ是UTF-8印度梵文三字节字符:E0 A2 A4和ࢤ也是三字节字符(阿拉伯语):E0 A4 A2,count_chars函数计算各个字节。因此,如果字符仅来自一种语言,那么使用是安全的,否则会得到一些令人头疼的问题......

在我看来,为了管理这类事情,我们需要有3个字节组成的字符。

答案 1 :(得分:3)

我会选择这样的事情:

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";
    }
}

答案 2 :(得分:0)

您可以拆分每个字符串并对其进行排序,如下所示:

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

然后您可以遍历两个数组,比较值。

答案 3 :(得分: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”)=&gt;是 isRotationalString(“abcd”,“cbda”)=&gt;它不是

答案 4 :(得分:0)

这是一个用于比较两个字符串的多字节安全函数:

function mb_isAnagram($s1, $s2) {
    if (strlen($s1) != strlen($s2)) {
        return false;
    } else {
        $c1 = preg_split('//u', $s1, null, PREG_SPLIT_NO_EMPTY);
        $c2 = preg_split('//u', $s2, null, PREG_SPLIT_NO_EMPTY);
        sort($c1);
        sort($c2);
        if ($c1 === $c2) {
            return true;
        } else {
            return false;
        }
    }
}

答案 5 :(得分:0)

这是字符串旋转的函数。

echo isRotationalString("abcdef","efabcd")?'It is':'It is not';

function isRotationalString($str1,$str2){
    $len = strlen($str1); 
    if($str1 === $str2){
        return true;
    } else {
        if($len == strlen($str2)) {
    
            $stringMatchedArr1 = $stringMatchedArr2 = [];
            for($i=0; $i<$len; $i++) {
                $substr = substr($str1,$i );
                $pos = strpos($str2, $substr);
                if($pos !== false) {
                    $stringMatchedArr1[] = $substr;
                }
            }
        
            for($j=1; $j <= $len; $j++) {
                $substr = substr($str1, 0, $j );
                $pos = strpos($str2, $substr);
                if($pos !== false) {
                    $stringMatchedArr2[] = $substr;
                }
            }
        
            foreach($stringMatchedArr2 as  $string1) {
                foreach($stringMatchedArr1 as $string2) {
                    if($string1.$string2 == $str1)
                         return true;
                }
            }
       
        }
    }
}

答案 6 :(得分:-3)

我会对字符串中的字符进行排序,使其成为一个数组,然后将它们再次拼接成一个字符串。

Eloquent

这可以在一行中完成。

编辑:谢谢Don's Panic,编辑了我的答案!