开发高效率:如你写的前两段,使用正则式.
执行高效率:不使用正则式.比如做个while循环,不断把两个相同空格替换成一个空格直到没有两个连续空格.
至于你写的第三种情况,创建新的空字串,依次截取源串的每个字符连接到新串中,如果当前字符与前一字符相同则放弃掉.

解决方案 »

  1.   

    <?php
      //把字符串中的任意连续字符换成一个对应字符
      $str1 = "ACCCB  CCCCCGGG  OOO  YYYFFFXXXZZZZZ";
      echo $str1 . " <br />";
      $len = strlen($str1);
      $str2 = $str1[0];
      $ch = $str2;
      for($i=1; $i<$len; $i++){
        $ch2=$str1[$i];
        if($ch!=$ch2){
      $str2.=$ch2;
      $ch=$ch2;
    }
      }
      echo $str2 . "<br />"; 
    ?>
    不太熟PHP,临时看PHP手册写的.
      

  2.   

    用字符串的函数会比正则的高吧。。
    用内置的函数比用循环要高吧$str1 = 'A    B        C  ';
    $str2 = 'AMMMBMMMMCMM  ';
    echo trim_letter($str2,'M');
    function trim_letter($str,$spe)
    {
    if(is_string($str))
    {
    $new_str=explode($spe,$str);
    $return_str=$spe.implode('',$new_str);
    return $return_str;
    }
    }$str1 = 'ACCCB  CCCCCGGG  OOO  YYYFFFXXXZZZZZ';
    echo trim_more_letter($str1);
    function trim_more_letter($str)
    {
    if(is_string($str))
    {
    $new_str=str_split($str,1);
    $return_str=array_unique($new_str);
    return implode('',$return_str);
    }
    }
      

  3.   

    上面用了两种方法验证。。其实用第二种就可以实现三种的了。。
    $str1 = 'A    B        C  ';
    $str2 = 'AMMMBMMMMCMM  ';
    $str3 = 'ACCCB  CCCCCGGG  OOO  YYYFFFXXXZZZZZ';
    echo trim_more_letter($str1);
    echo trim_more_letter($str2);
    echo trim_more_letter($str3);
    function trim_more_letter($str)
    {
    if(is_string($str))
    {
    $new_str=str_split($str,1);
    $return_str=array_unique($new_str);
    return implode('',$return_str);
    }
    }
    /*
    结果:A BC
    结果:AMBC
    结果:ACB GOYFXZ
    */
      

  4.   

    考虑这类效率应该不是PHP干的事还不如你写个C函数然后包装到php库中来得效率高.
      

  5.   

    前两种没问题,
    用正则的后向引用可以简单的完成第三种功能
    <?php
      $str = 'ACCCB  CCCCCGGG  OOO  YYYFFFXXXZZZZZ'; 
      echo preg_replace("/(.)\\1+/","\\1",$str);
      

  6.   

    我只知道把strlen($str1)提出来写好点
      

  7.   

    第一二三种情况是同一种情况吗?怎么看都不像.
    如果第一二条的测试字串是下面这两个呢  //把字符串中的任意空格换成一个 
      $str1 = 'A    B        CCCC  DDD';   //把字符串中的任意连续字符 M 换成一个 M 
      $str1 = 'AMMMBMMMMCMMGGGMDDDD  ';
    把一二三看成一样的话,能不能得到正确结果?
      

  8.   

    lxtrayn 的 echo preg_replace("/(.)\\1+/","\\1",$str); 是最简洁的方法!!!
    nanyang9 的代码正确。
    其他人的思路可以,但是结果不正确,也没有循环快速。
    其实三种情况可以认为是一种情况,前2种是第三种的特殊情况,实现第三种就可以了。
      

  9.   

    <?
    $str1 = 'AMMMBMMMMCMM  '; 
    $array=array();
    for($i=0;false!=($k=$str1[$i]);$i++){
    $array[]=$k;
    }
    echo join("",array_unique($array));
    ?>
      

  10.   


    <?php
    //把字符串中的任意连续字符换成一个对应字符
    function trimLetter($str){
    $_strLen = strlen($str);
    $_result = null;
    $_resultLen = 0;
    $_cStr = null;
    $_pResult = null;
    for ($i=0;$i<$_strLen;$i++)
    {
    $_cStr = $str[$i];
    $_pResult = $_result[$_resultLen-1];
    if($_cStr != $_pResult)
    {
    $_resultLen++;
    $_result .= $_cStr;
    }
    }
    return $_result;
    }
    $str = "AACCCCCCCCCCAAAAAAAAAAAAAACCCCCCCCCCCCCCCAAAAAAAAAAAAACCCCCCCCCCC";
    echo trimLetter($str); // ACACAC
    ?>很明显使用array_unique是有问题的,在这里他只会显示AC。
      

  11.   


    <?php
    /**
     * 剔除重复字符
     * 
     * @param String $str 需要处理的字符串
     * @param Array<String> [$_sp] 需要削剔的字符列表
     * @return String $_result
     */
    function trimLetter($str,array $_sp = array()){
    $_strLen = strlen($str);
    $_result = null;
    $_cStr = null;
    $_cStrC = null;
    $_isEqual = false;
    settype($_sp,'array'); // 多疑的人就加上 -_-#
    $_isSpEmpty = empty($_sp);
    for ($i=0;$i<$_strLen;$i++)
    {
    $_cStr = $str[$i];
    $_cStrC = $str[$i+1];
    $_isEqual = ($_cStr == $_cStrC);
    if (!$_isSpEmpty)
    {
    if (in_array($_cStr,$_sp))
    {
    if(!$_isEqual)
    {
    $_result .= $_cStr;
    }
    }else{
    $_result .= $_cStr;
    }
    }else{
    if(!$_isEqual)
    {
    $_result .= $_cStr;
    }
    }
    }
    return $_result;
    }
    $str = 'AABBCCDDEEFFGGHH';
    echo trimLetter($str); # ABCDEFGH
    echo "\n";
    echo trimLetter($str,array('A','C')); # ABBCDDEEFFGGHH
    ?>
    整理了下。