计算字符串中重复出现的 0 和 1
count repeated occurrence of 0 & 1 in a string
Return false
如果 0
或 1
在字符串中的重复出现次数大于数字 ($k
)。
我写了一个可以运行的函数,但我需要对其进行优化:
<?php
function satisfied($str, $k){
$stream = $last = $str[0];
for($i = 1; $i <= strlen($str)-1; $i++){
if($str[$i] != $last) $last = $stream = $str[$i];
else $stream .= $str[$i];
if(strlen($stream) > $k) return false;
}
return true;
}
示例:
satisfied("0111", 2)
- 错误
satisfied("0111", 3)
- 正确
satisfied("00111000111", 3)
- 正确
satisfied("00111000111", 4)
- 真
我想知道我是否可以在 preg_match
的帮助下做到这一点?
类似于:
preg_match('/(0+|1+){'.$k.'}/', "0111");
,这与我想要实现的目标相去甚远。
我想避免for循环来优化代码。 preg_match
会比上面的函数快吗?显然,您也可以建议我调整现有功能。
谁能帮帮我。
您可以将输入作为字符数组,这正是您要查找的内容:
<?php
function printCharMostRepeated($str)
{
if (!empty($str))
{
$max = 0;
foreach (count_chars($str, 1) as $key => $val)
if ($max < $val) {
$max = $val;
$i = 0;
unset($letter);
$letter[$i++] = chr($key);
} else if ($max == $val)
$letter[$i++] = chr($key);
if (count($letter) === 1)
echo 'The character the most repeated is "'.$letter[0].'"';
else if (count($letter) > 1) {
echo 'The characters the most repeated are : ';
$count = count($letter);
foreach ($letter as $key => $value) {
echo '"'.$value.'"';
echo ($key === $count - 1) ? '.': ', ';
}
}
} else
echo 'value passed to '.__FUNCTION__.' can\'t be empty';
}
$str = 'ddaabbccccsdfefffffqqqqqqdddaaa';
printCharMostRepeated($str);
你可以用 strpos
:
function satisfied($str, $k) {
return strpos($str, str_repeat('0', $k+1)) === false
&& strpos($str, str_repeat('1', $k+1)) === false;
}
或者您可以使用 preg_match
进行简单的交替:
function satisfied($str, $k) {
$k++;
$pattern = '~0{' . $k . '}|1{' . $k . '}~';
return !preg_match($pattern, $str);
}
请注意,preg_match
returns 是一个整数(如果出现问题,则为 false),但由于存在否定运算符,因此返回值被转换为布尔值。
Return false
如果 0
或 1
在字符串中的重复出现次数大于数字 ($k
)。
我写了一个可以运行的函数,但我需要对其进行优化:
<?php
function satisfied($str, $k){
$stream = $last = $str[0];
for($i = 1; $i <= strlen($str)-1; $i++){
if($str[$i] != $last) $last = $stream = $str[$i];
else $stream .= $str[$i];
if(strlen($stream) > $k) return false;
}
return true;
}
示例:
satisfied("0111", 2)
- 错误
satisfied("0111", 3)
- 正确
satisfied("00111000111", 3)
- 正确
satisfied("00111000111", 4)
- 真
我想知道我是否可以在 preg_match
的帮助下做到这一点?
类似于:
preg_match('/(0+|1+){'.$k.'}/', "0111");
,这与我想要实现的目标相去甚远。
我想避免for循环来优化代码。 preg_match
会比上面的函数快吗?显然,您也可以建议我调整现有功能。
谁能帮帮我。
您可以将输入作为字符数组,这正是您要查找的内容:
<?php
function printCharMostRepeated($str)
{
if (!empty($str))
{
$max = 0;
foreach (count_chars($str, 1) as $key => $val)
if ($max < $val) {
$max = $val;
$i = 0;
unset($letter);
$letter[$i++] = chr($key);
} else if ($max == $val)
$letter[$i++] = chr($key);
if (count($letter) === 1)
echo 'The character the most repeated is "'.$letter[0].'"';
else if (count($letter) > 1) {
echo 'The characters the most repeated are : ';
$count = count($letter);
foreach ($letter as $key => $value) {
echo '"'.$value.'"';
echo ($key === $count - 1) ? '.': ', ';
}
}
} else
echo 'value passed to '.__FUNCTION__.' can\'t be empty';
}
$str = 'ddaabbccccsdfefffffqqqqqqdddaaa';
printCharMostRepeated($str);
你可以用 strpos
:
function satisfied($str, $k) {
return strpos($str, str_repeat('0', $k+1)) === false
&& strpos($str, str_repeat('1', $k+1)) === false;
}
或者您可以使用 preg_match
进行简单的交替:
function satisfied($str, $k) {
$k++;
$pattern = '~0{' . $k . '}|1{' . $k . '}~';
return !preg_match($pattern, $str);
}
请注意,preg_match
returns 是一个整数(如果出现问题,则为 false),但由于存在否定运算符,因此返回值被转换为布尔值。