求解:在一份文本文件中,查找其中所有的anagram。例如,如果这份文件中包含了stop、tops、pots这样三个单词,这三个词就是一组 anagram,这三个单词都是由s、t、o、p这四个字母组成的。这份文件中可能存在多组anagram,大小写视为同样字符。在解答时,需要注意代码的效率、质量。当不能给出完整代码时,可以描述解题思路。(PS:该题目取自JAVA板块,本人仅做练习用)。
下面是PHP常规思维的源码,没有用class,尽写function了。
<?php //定义字符偏移量 $alpha=array( array('a','A'), array('b','B'), array('c','C'), array('d','D'), array('e','E'), array('f','F'), array('g','G'), array('h','H'), array('i','I'), array('j','J'), array('k','K'), array('l','L'), array('m','M'), array('n','N'), array('o','O'), array('p','P'), array('q','Q'), array('r','R'), array('s','S'), array('t','T'), array('u','U'), array('v','V'), array('w','W'), array('x','X'), array('y','Y'), array('z','Z'), ); //分裂文本为串 function splitText($file=''){ $text=file_get_contents($file); if(!$text){ return false; }else{ $reg='/\s+|\n/'; return preg_split($reg,$text); } } //获取串的第一个字符值 function firstValue($char){ global $alpha; foreach($alpha as $key=>$set){ if(in_array($char,$set)){ return $key; } } return false; } //计算偏移量 function calcOffset($num,$min){ return $num-$min; } //获取串的最小字符值,偏移量数组 function calcCond($str){ if(!$str){ return false; }else{ global $alpha; $length=strlen($str); $min=firstValue(substr($str,0,1)); $sort=array(); $sort[0]=$min; for($i=1;$i<$length;$i++){ $temp=substr($str,$i,1); foreach($alpha as $key=>$set){ if(in_array($temp,$set)){ if($key<=$min){ $min=$key; } $sort[]=$key; continue; } } } if(sort($sort)){ if(array_map('calcOffset',$sort,array_fill(0,count($sort)-1,$min))){ return array($min,$sort); } } return false; } } //判断anagram function justAnagram($a,$b){ if($a===$b){ return true; }else{ if(strlen($a)!=strlen($b)){ return false; }else{ $rsA=calcCond($a); $rsB=calcCond($b); for($i=0;$i<count($rsA);$i++){ if($rsA[$i]!=$rsB[$i]) return false; } return true; } } } //判断文本中存在的anagram,返回数组 function findAnagrams($file='test.txt'){ $array=splitText($file); if(!$array){ return false; } $rs=array(); $i=0; while(!empty($array)){ $first=$array[0]; $rs[$i]=array($first); $count=count($array); $track=array(0); for($j=1;$j<$count;$j++){ if(justAnagram($first,$array[$j])){ $rs[$i][]=$array[$j]; $track[]=$j; continue; } } $count2=count($track); for($k=$count2-1;$k>=0;$k--){ array_splice($array,$k,1); } $i++; } return $rs; } print_r(findAnagrams()); ?>