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别担心,这个问题本身在多个方面都有误导性。