删除字符串php中的重复字母

时间:2015-09-06 19:46:53

标签: php string

我试图解析一个字符串并删除相同的相邻字母。我想返回删除次数的计数,并在删除后输出结果字符串。说我有

<script src="jquery.nicescroll.js"></script>

如您所见,您需要进行5次删除以使相邻字母不相同。 $(document).ready(function() { $("html").niceScroll(); }); 字符串为$str = "aaabbbcc"; ,删除次数为$output

"abc"

修改 这是一个面试问题,我不应该使用任何内置函数,如five 谢谢你的帮助 !

6 个答案:

答案 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