使用PHP判断anagram

求解:在一份文本文件中,查找其中所有的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());
?>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值