需要编写一个代码块,检查是一个字符串是另一个字符串的旋转。
看看这里的大量帖子,它们都是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;
});
答案 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,编辑了我的答案!