天天看點

字元串之模式比對

  字元串中的所有首字母出現索引位置(遞歸版)

  * @author: cutefrog([email protected])

  * @parameter: $mainstr 主字元串(必要參數)

  * @parameter: $modestr 模式串(必要參數)

  * @parameter: $mainpos 主字元串起始索引(可選參數)

  * @parameter: $modepos 模式串起始索引(可選參數)

  * @parameter: $matcheds 比對到的索引數組(不需傳入的參數,隻作為遞歸時函數傳遞參數之用)

  * @return: $matcheds 如果非空傳回比對到的索引數組,否則傳回-1

  */

  function myStrPos_recursive( $mainstr, $modestr, $mainpos = 0, $modepos = 0, $matcheds = array() ) {

  //若數組為空則傳回-1,否則傳回比對到的數組

  if( !isset( $mainstr[$mainpos] ) ) {

  return empty($matcheds)?-1:$matcheds;

  }

  //如果比對到了就繼續與模式串的下一個字元比較

  if ( $modestr[$modepos] == $mainstr[$mainpos] ) {

  if ( !isset($modestr[$modepos+1]) ){

  //将比對結果加入數組

  array_push( $matcheds, $mainpos - $modepos );

  return myStrPos_recursive ( $mainstr, $modestr, ++$mainpos, 0, $matcheds );

  }

  return myStrPos_recursive ( $mainstr, $modestr, ++$mainpos, ++$modepos, $matcheds );

  }

  //否則回溯主串字元數組索引

  else {

  return myStrPos_recursive ( $mainstr, $modestr, $mainpos-=$modepos-1, 0, $matcheds );

  }

  }

  

  function myStrPos_iteration( $mainstr, $modestr ) {

  $mainlen = strlen( $mainstr );

  $modelen = strlen( $modestr );

  $matchedpos = -1;

  $limit = 0;

  $matcheds = array();

  for ( $mainpos = 0; $mainpos

  下次再寫個KMP算法的。