【问题标题】:delete the repetetion letters in a string php删除字符串php中的重复字母
【发布时间】:2015-09-06 19:46:52
【问题描述】:

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

$str = "aaabbbcc";

如您所见,您需要删除 5 次才能使相邻的字母不相同。 $output 字符串为"abc",删除次数为five

function str_deletions ($str)
{
    $prev = $str[0];
    $length = strlen($str);
    $deletions = 0;
    $output = "";

    for ($i=1 ; $i < $length; $i++)
    {
        if ($str[$i]== $prev)
        {
            $deletions++;
            $prev = $str[$i];  // not sure here ?
        }
    }
    echo $output;   // ? 
    return $deletions;
}
$str = "aabbcc";
echo str_deletions ($str);

编辑 这是一个面试问题,我不应该使用任何内置函数,如regex or array_count_values 谢谢你的帮助 !

【问题讨论】:

  • 是的,正则表达式会更简单。 Remove repeating character 的可能重复项
  • @mario 我也想统计删除的数量..
  • preg_replace('/[a-z]+/', '$1', $str); 或类似的东西。删除量:strlen($str)-strlen($result)未测试

标签: php string


【解决方案1】:

这是另一个正则表达式解决方案。我使用正则表达式仅匹配重复的单词字符,然后逐个删除每个连续的重复字符,这使我可以将&amp;$count 参数与preg_replace 一起使用:

计数
如果指定,此变量将填充完成的替换次数。

正则表达式是

(\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

【讨论】:

  • 感谢您的解决方案,它有效,想知道我们是否可以在没有正则表达式的情况下以老式方式做到这一点:)
  • @CasimiretHippolyte 我不喜欢正则表达式。令人困惑:(
  • @WildWidow:我知道正则表达式可能会令人困惑,但在这种情况下,它相当简单:(\w) 匹配并捕获一个单词字符到第 1 组中,而后面有相同的字符它((?=\1)),删除它并将删除计数保存到$countpreg_replace。您稍后添加了 no-regex-please 限制。我仍然希望这个答案对你有用。
  • @stribizhev 谢谢你,更新了你的帖子。
  • @WildWidow 在这种情况下不理解正则表达式会导致您编写大量额外的代码行。如果你在一年的时间里把它加起来,你可以写一个正则表达式来更快更简单地做一些事情,我想你会发现它值得学习!开始慢一点,比如regexr
【解决方案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";
?>

没有内置函数

出于完成的目的(并且由于您更新了您的问题并提供了更多信息,说我们不能使用正则表达式,因为它是一个面试问题),这就是我要做的:

使用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(); 将返回字符串中的 unique 字符,而不是完全删除重复项(即“aabbccaa”仍会产生“abc”作为输出),但您的问题并不清楚面试官想要什么 - 它是 真正的删除重复问题还是唯一字符问题。

使用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);

注意:值得指出的是,如果我意识到这是一个面试问题,我就不会提供答案,因为这样做因为你有点打败了目的。尽管如此,现在这里的答案数量众多,而且我在采访中看到过类似的东西,我希望有人能从中吸取教训。

【讨论】:

    【解决方案3】:

    基本算法(确实$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;
    }
    

    【讨论】:

    • @WildWidow 如果您认为 Casimir 已经回答了您的问题或其他任何人,请将其标记为正确,以便将来的用户可以找到此问题以及对您有用的问题。它还阻止它进入大量“实际上有答案的未回答问题”;)。祝你工作顺利。
    • 别担心——我们不在乎被接受,我们都提供了不同的解决方案。不过很高兴你被分类了。
    【解决方案4】:

    我改变了你的功能
    这不会同时返回输出字符串和删除次数

                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 )
    

    【讨论】:

    • 我已经编辑了问题以评论额外的行,也在你的代码中删除
    【解决方案5】:

    解决了除了count没有外部函数;

    $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;
    

    【讨论】:

    • count_chars 在这种情况下不起作用,假设输入字符串是“aaabbbcca”,我希望输出是“abca”。
    【解决方案6】:

    找出删除数量的直接解决方案可以是

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-11
      • 2019-06-19
      • 2021-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多