在一大堆长字符串中,查找出现频率最高的连续的五个字符,例:我是中国人我是外国人我是韩国人我是美国人我是中国人我是英国人我是中国人我是外国人
  就返回我是中国人,因为我是中国人出现的频率最高,这怎么做啊??我刚刚接触php,啥都不会,求帮助,字符串里可能有特殊字符啥的,连续的字符数暂时是五个,也可能是三个,四个的,
 求帮助,多给几个方法

解决方案 »

  1.   

    将字符串,按照指定长度,切割一遍,存为数组例如12312,按照2个切
    得到数组
    array('12' => 2, '23' => 1, '31' => 1)只要找元素值最大的,下表即可
      

  2.   

    “我是中国”,“是中国人”,“中国人我”……感觉像是我在向你提问题,哈哈substr_count()
    或者分成数组用array_count_values()大致思路是用这两个,但两个都要先确定怎么分子串
      

  3.   


    // 用了个笨方法
    <?php  $str = "我是中国人我是外国人我是韩国人我是美国人我是中国人我是英国人我是中国人我是外国人";$reg = '/([\x{4e00}-\x{9fa5}A-Za-z0-9_]{5})((?:.(?!\\1))*)/uime';$totals = array();function total($str, $after) {
    static $totals = null; if($totals === null) {
    $totals =& $GLOBALS['totals'];
    } if(isset($totals[$str])) {
    $totals[$str] += 1;
    } else {
    $totals[$str] = 1;
    } return $str . $after;
    }preg_replace($reg, 'total("\\1", "\\2")', $str);var_dump($totals);
      

  4.   


    <?php    $str = "我是中国人我是外国人我是韩国人我是美国人我是中国人我是英国人我是中国人我是外国人";$reg = '/([\x{4e00}-\x{9fa5}A-Za-z0-9_]{5})((?:.(?!\\1))*?)/uime'; // 少了个问号$totals = array();function total($str, $after) {
    static $totals = null; if($totals === null) {
    $totals =& $GLOBALS['totals'];
    } if(isset($totals[$str])) {
    $totals[$str] += 1;
    } else {
    $totals[$str] = 1;
    } return $str . $after;
    }preg_replace($reg, 'total("\\1", "\\2")', $str);var_dump($totals);
      

  5.   


    我是超菜鸟级别的。
    昨天才装上php,今天就要做这种题目啊,啥都不会
      

  6.   

    建立一个词组库,像dz 一样,在自动获取tag的时候,是从词组服务器里面反馈结果的。。
      

  7.   


    <?php    $str = "1我是中国人3我是外国人4我是韩国人5我是美国人6我是中国人777我是英国人8我是中国人9我是外国人";$totals = array();mb_internal_encoding("UTF-8");$len = mb_strlen($str);for($i = 0; $i < $len; $i++) {
    $substr = mb_substr($str, $i, 5); if(mb_strlen($substr) == 5 && !isset($totals[$substr])) {
    $totals[$substr] = mb_substr_count($str, $substr);
    }
    }var_dump($totals);
      

  8.   

    随便写了个,试试看。$str ='我是中国人我是外国人我是韩国人我是美国人我是中国人我是英国人我是中国人我是外国人';
    Count_string($str,5);
    function Count_string($sstr,$length)
    {
    $cnt_tmp = 0;
    $cnt = 0;
    $str = '';
    $str_tmp = array();
    $str_arr = array();
    $max_length = (mb_strlen($sstr,'gb2312')-$length);

    //取得子串集
    for($i=0;$i<=$max_length;$i++)
    {
    $str_tmp[] =  mb_substr($sstr, $i, $length, 'gb2312');
    }
    //去除重复子串 
    $str_tmp = array_unique($str_tmp);

    //计算出现次数
    foreach($str_tmp as $key=>$value)
    {
    $cnt_tmp = mb_substr_count($sstr,$value,'gb2312');
    if($cnt_tmp>=$cnt) 
    {
    $cnt = $cnt_tmp;
    $str_arr[$value] = $cnt;
    }
    }

    //处理出现多重结果
    foreach($str_arr as $key=>$value)
    {
    if($value == $cnt)
    {$str .=$key."<br>";}
    } echo '出现最多的子串是:<br>'.$str.'<br>出现次数:'.$cnt;
    }
    输出:
    出现最多的子串是:
    我是中国人
    是中国人我
    中国人我是
    出现次数:3
      

  9.   


    我是超超级菜鸟啊,昨天才晚上才开始弄php今天就要做这种功能啊
      

  10.   


    <?php    $str = "1我是中国人3我是外国人4我是韩国人5我是美国人6我是中国人777我是英国人8我是中国人9我是外国人";// 给你封装成函数吧
    function countStr($str, $charlen, $charset="UTF-8") {
    $totals = array(); mb_internal_encoding($charset); $len = mb_strlen($str); for($i = 0; $i < $len; $i++) {
    $substr = mb_substr($str, $i, $charlen); if(mb_strlen($substr) == $charlen && !isset($totals[$substr])) {
    $totals[$substr] = mb_substr_count($str, $substr);
    }

    }

    $max = max($totals);
    $strs = array();
    foreach($totals as $substr => $total) {

    if($max == $total) {
    $strs[] = $substr;
    } }
    return array($strs, $max);
    }list($strs, $number)  = countStr($str, 5);echo '最多的词是:', implode(',', $strs), "\n";
    echo '重复次数: ', $number;
      

  11.   

    本帖最后由 xuzuning 于 2011-04-20 11:45:46 编辑