开发高效率:如你写的前两段,使用正则式.
执行高效率:不使用正则式.比如做个while循环,不断把两个相同空格替换成一个空格直到没有两个连续空格.
至于你写的第三种情况,创建新的空字串,依次截取源串的每个字符连接到新串中,如果当前字符与前一字符相同则放弃掉.
执行高效率:不使用正则式.比如做个while循环,不断把两个相同空格替换成一个空格直到没有两个连续空格.
至于你写的第三种情况,创建新的空字串,依次截取源串的每个字符连接到新串中,如果当前字符与前一字符相同则放弃掉.
调试欢乐多
//把字符串中的任意连续字符换成一个对应字符
$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手册写的.
用内置的函数比用循环要高吧$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);
}
}
$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
*/
用正则的后向引用可以简单的完成第三种功能
<?php
$str = 'ACCCB CCCCCGGG OOO YYYFFFXXXZZZZZ';
echo preg_replace("/(.)\\1+/","\\1",$str);
如果第一二条的测试字串是下面这两个呢 //把字符串中的任意空格换成一个
$str1 = 'A B CCCC DDD'; //把字符串中的任意连续字符 M 换成一个 M
$str1 = 'AMMMBMMMMCMMGGGMDDDD ';
把一二三看成一样的话,能不能得到正确结果?
nanyang9 的代码正确。
其他人的思路可以,但是结果不正确,也没有循环快速。
其实三种情况可以认为是一种情况,前2种是第三种的特殊情况,实现第三种就可以了。
$str1 = 'AMMMBMMMMCMM ';
$array=array();
for($i=0;false!=($k=$str1[$i]);$i++){
$array[]=$k;
}
echo join("",array_unique($array));
?>
<?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。
<?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
?>
整理了下。