如题,现有一个字符串
$str = [p,a,d,pa,pad,ipad,ipad2];如何去除里面的冗余数据,比如如果某个值已经包含其他值了,就需要把它删除掉。
ipad包含pad,就需要删除ipad;
pad包含pa,就需要删除pad;
pa包含a,就需要删除pa;最后得到的数据是:
$str = [p,a,d];算法该怎么写?

解决方案 »

  1.   

    这个例子描述得糊涂, 因为冇说明白 'i' 和 '2' 算啥 ...针对这个例子的简单思路: 把 $str 劈成单字词 (数组) 并构造字典, 枚举单字词劈成单字符并构造字典, 俩字典的交集就是啦 ...
      

  2.   

    pad 和 ad有包含关系
    pad 和 da 呢?算包含还是不包含?
      

  3.   

    pad和da没关系,按照字符从左到右的顺序来确定是否包含。
      

  4.   

    看看这段代码:
    <?php$str = array('p','pad','ipad','a','d','pa','ipad2');
    $flagArray = array(0,0,0,0,0,0,0);
    $result = array();for($i=0;$i<count($str);$i++)
    {
    for($j=0;$j<count($str);$j++)
    {
    if($i !== $j)
    {
    if(strpos($str[$j],$str[$i]) !== false)
    {
    $flagArray[$j] = 1;
    }
    }
    }
    }
    for($i=0;$i<count($str);$i++)
    {
    if(!($flagArray[$i]))
    {
    array_push($result,$str[$i]);
    }
    }
    print_r($result);?>
      

  5.   

    最后的$result就是你要的结果集吧。应该是实现了,但是效率还值得商榷,思路就是把把含有子窜的父串标记一下(标记为1),到最后把标记为1的项都删掉!
      

  6.   


    $str = array('p','pad','ipad','a','d','pa','ipad2');
    $flagArray = array(0,0,0,0,0,0,0);
    $result = array();for($i=0;$i<count($str);$i++)
    {
    for($j=0;$j<count($str);$j++)
    {
    if($i !== $j)
    {
    if(strpos($str[$j],$str[$i]) !== false)
    {
    $flagArray[$j] = 1;
    }
    }
    }
    }
    for($i=0;$i<count($str);$i++)
    {
    if(!($flagArray[$i]))
    {
    array_push($result,$str[$i]);
    }
    }
    print_r($result);
      

  7.   

    固定从左到右确定包含,应该说减少了很多工作了。
    $str = array('p','a','d','pa','pad','ipad','ipad2');
    for($k=0;$k<count( $str );$k++)
    {
    if(empty( $str[$k] )) continue;
    $a = preg_grep('#(?='.$str[$k].')#i',$str);
    foreach((array)$a as $k2=>$v2 )
    {
    if($k != $k2 ) unset( $str[$k2] );
    }
    }
    print_r( $str );