我试图解析一个字符串并删除相同的相邻字母。我想返回删除次数的计数,并在删除后输出结果字符串。说我有
<script src="jquery.nicescroll.js"></script>
如您所见,您需要进行5次删除以使相邻字母不相同。 $(document).ready(function() {
$("html").niceScroll();
});
字符串为$str = "aaabbbcc";
,删除次数为$output
。
"abc"
修改
这是一个面试问题,我不应该使用任何内置函数,如five
谢谢你的帮助 !
答案 0 :(得分:2)
使用preg_replace()
后,这是一种更简单的方法:
<?php
function str_deletions($str){
$replaced = preg_replace("/(.)\\1+/", "", $str);
$length = strlen($str) - strlen($replaced);
return array("new_word" => $replaced, "chars_replaced" => $length);
}
$str = "aabbcc";
$string_deletions = str_deletions($str);
echo "New String: " . $string_deletions['new_word'] . "\n";
echo "Chars deleted: " . $string_deletions['chars_replaced'] . "\n";
?>
为了完成目的(并且由于您更新了您的问题并提供了更多信息,表示我们无法使用正则表达式,因为这是一个面试问题),这就是我所说的“#”。 d do:
使用count_chars()
:
function str_deletions($str){
$string_data['new_word'] = count_chars($str,3);
$string_data['chars_replaced'] = strlen($str) - strlen($string_data['new_word']);
return $string_data;
}
$str = "aabbcc";
echo str_deletions($str);
注意:在此示例中count_chars();
会在字符串中返回唯一字符,而不是完全删除重复字符(即&#34; aabbccaa&#34;会仍然屈服&#34; abc&#34;作为输出)但你的问题并不清楚采访者想要的是什么 - 它是 是否真的是一个删除重复的问题或一个独特的问题。< / p>
使用array_unique()
:
稍微慢一些,有点紧张:
function str_deletions($str){
$string_array = array_unique(str_split($str));
foreach($string_array as $string_cur){
$string_data['new_word'] .= $string_cur;
}
$string_data['chars_replaced'] = strlen($str) - strlen($string_data['new_word']);
return $string_data;
}
$str = "aabbcc";
echo str_deletions($str);
注意:值得指出的是,如果我意识到这是一个面试问题,我就不会提供一个答案,因为 >你有点失败的目的。不过,现在有了大量的答案以及我在采访中看到了类似的事实,我希望有人可以从中学到这些。
答案 1 :(得分:2)
这是另一种正则表达式解决方案。我使用正则表达式只匹配重复的单词字符,然后逐个删除每个连续的重复字符,这允许我使用preg_replace
&$count
参数:
<强>计数强>
如果指定,则此变量将填充已完成的替换次数。
正则表达式是
(\w)(?=\1)
见demo。请注意,您可以将\w
替换为.
以匹配除换行符之外的任何字符。或者如果您只需要匹配字母,我建议使用'/(\p{L})(?=\1)/u'
请参阅IDEONE demo:
$str = "aaabbbcc";
$cnt = -1;
$result = preg_replace('/(\w)(?=\1)/', "", $str, -1, $cnt);
echo "Result: " . $result . PHP_EOL . "Deletions: " . $cnt;
输出:
Result: abc
Deletions: 5
答案 2 :(得分:1)
解决除了计数外没有外部功能;
$str="aaavvvffccca";
$count = strlen($str);
for($i=0;$i<$count;$i++){
$array[]=$str[$i];
}
$del =0;
for($i=0;$i<$count;$i++){
$next=isset($array[$i+1])?$array[$i+1]:null;
if($array[$i]==$next)
{
$del++;
}
else
{
$newarray[]=$array[$i];
}
}
echo "Filter Text:". implode('',$newarray);
echo"Total Deleted:".$del;
答案 3 :(得分:1)
我改变了你的功能
这不会返回输出字符串和删除次数
function str_deletions ($str)
{
$prev = NULL;
$deletions = 0;
$output = "";
$i=0;
while ($i < strlen($str))
{
if (substr($str,$i,1) == $prev)
{
$deletions++;
//$prev = substr($str,$i,1);/*remove this line, no need here as the same stmnt is there after ifelse*/
}else{
$output.=substr($str,$i,1);
}
$prev = substr($str,$i,1);
$i++;
}
$arr = array(
'output'=>$output,
'deletions'=>$deletions
);
return $arr;
}
$str = "aaabbcc";
print_r(str_deletions ($str));
上述函数调用的输出是
Array ( [output] => abc [deletions] => 4 )
答案 4 :(得分:1)
基本算法(确实$prev = $str[$i];
并不是在好地方,但你不是很远):
function str_deletion($str) {
$del = 0;
if (1 < $length = strlen($str)) { // $str has more than 1 char
$prev = $str[0];
$output = $prev;
for ($i=1; $i<$length; $i++) {
if ($prev == $str[$i]) {
$del++;
} else {
$prev = $str[$i]; // when different, change the previous character
$output .= $prev; // and append it to the output
}
}
} else {
$output = $str;
}
echo $output;
return $del;
}
答案 5 :(得分:0)
找出删除次数的直接解决方案可以是
If there are N consecutive same characters delete N-1 out of those N characters.
function str_likes($str)
{
$length = strlen($str);
$del = 0;
for ($i=0 ; $i < $length ; $i++)
{
if ($str[$i] == $str[$i+1])
{
$del++;
}
}
return $del;
}
$str = "aabbccaaa";
echo str_likes($str); //4