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

PHP-检查一个字符串是否是另一个字符串的旋转,php,string,Php,String,需要写一个代码块,检查一个字符串是否是另一个字符串的旋转 查看了这里的帖子,它都是用java或C++编写的,但是我需要用PHP来做。 我尝试了一些不同的东西,尝试从C++和java例子中工作,但是我没有任何运气,这是我现在的代码: <?php function isSubstring($s1, $s2) { if(strlen($s1) != strlen($s2)) { return false; } if(WHAT TO PUT HERE

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

查看了这里的帖子,它都是用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");

?>

我喜欢这样的东西:

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";
    }
}
$split1 = unpack("C*",$s1);
asort($split1);

我会将字符串中的字符排序,方法是将其设置为数组,然后再次将其内爆为字符串

if (sort(str_split($s1)) == sort(str_split($s2))) {
这一行就行了


编辑:谢谢不要惊慌,编辑了我的答案

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

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";
    }
}
$split1 = unpack("C*",$s1);
asort($split1);

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

有多种可用方法。这里还有一个在两个字符串上使用内置函数,然后比较两个结果数组:

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";
    }
}
编辑:正如蒙基宙斯指出的那样,小心与多字节字符进行比较。它可能有点咬人:

isSubstring('crढap', 'paࢤrc');
将给出
true
作为答案。ढ 是UTF-8 indian devanagari三字节字符:
E0 A2 A4
和ࢤ 也是三字节字符(阿拉伯语):
E0 A4 A2
,count_chars函数对单个字节进行计数。所以,如果chars只来自一种语言,那么使用它是安全的,否则就吃些头痛药

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


<?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”)=>这不是一个比较两个字符串的多字节安全函数:

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

这是字符串旋转的函数

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;
                }
            }
       
        }
    }
}
echo isRotationalString(“abcdef”、“efabcd”)?“它是”:“它不是”;
函数isRotationalString($str1,$str2){
$len=strlen($str1);
如果($str1==$str2){
返回true;
}否则{
如果($len==strlen($str2)){
$stringMatchedArr1=$stringMatchedArr2=[];

对于($i=0;$i必须检查一个字符串的所有符号是否在另一个字符串中。或者对符号进行排序并检查它们是否相同。我将对两个字符串进行排序(按字母顺序)然后进行比较。使用strev,它将完全按照您的要求进行操作want@BramGerritsenstrev是个好主意,但它只有在字符串完全颠倒的情况下才起作用。不清楚“旋转”是什么意思,但从问题中的示例来看,对于以任何顺序包含相同字母的字符串,它似乎应该返回true。@不要惊慌,是的,你是对的,我在阅读问题时错过了最后一行。没有必要内爆;数组是可比的。通过引用接受数组并返回布尔值。这令人印象深刻,我喜欢it:)我想知道当使用
count_chars('221;ô',1)之类的东西时,这是否会表现出奇怪的行为
@MonkeyZeus你问得很好。从手册上看,计数的是单个字节,而多字节字符不是这样计数的,但计数的是它们的组成字节。返回的数组模式是
0
而不是
1
,它将是一个由256个值组成的数组,索引范围为0到255。所以我很肯定它是正确的我们不能用多字节字符中断。但是谁知道呢!用带重音的法语单词进行的快速短而脏的测试成功了。我过去10分钟也在尝试中断。哈哈。我想一个可行的中断方法是,在
$s1
中为它提供一个四字节字符,在
$s2
中为它提供两个双字节字符,它们使用e相同的四个字节点。我的标准美国qwerty键盘的范围仅在35-125之间,但多个字节进入高100-低200,因此可能需要一段时间才能找到打破它的组合:/@MonkeyZeus breaked!:-)请参阅更新的答案。谢谢。但您提出的函数也被同样的情况欺骗了;-)有什么作用“一个……另一个的轮换”是什么意思?我会把“轮换”解释为相同的字符,但有变化。那些从末尾掉下来的字符会从开头开始。
ABCDEF
DEFABC
或'FABCDE'答案只有在它们被洗牌的情况下才会测试。@BryanT这是一个你应该问OP的问题,但无论如何,基于OP的
isSubstring(”hello,“hello”);
示例我假设“rotation”一词不应该按字面意思理解,OP只是想检查两个字符串,看看它们的字符是否匹配,而不管顺序如何。根据OP接受我的答案,我有把握地认为我的猜测是正确的。也许“rotation”可以用“combination”代替“在OP的措辞中?我现在看到了他的测试字符串(没有看到)。函数名
isSubstring
也有误导性。@BryanT别担心,这个问题本身在多个方面都有误导性。