思路1 :
前提是只包含小写字母,小写字母只有26个,那么我们可以使用两个int数组(长度固定为26)来记录字母出现的次数,然后遍历比较个数是否相等即可
class Code{
function isZmyw($s,$t){
if(!$s&&!$s){
return true;
}
$arrS = str_split($s);
$arrT = str_split($t);
//获取字母出现次数数组
$arrSzCount = array();
foreach ($arrS as $key => $value) {
if(isset($arrSzCount[$value])){
$arrSzCount[$value]++;
}else{
$arrSzCount[$value] = 1;
}
}
//获取字母出现次数数组
$arrTzCount = array();
foreach ($arrT as $key => $value) {
if(isset($arrTzCount[$value])){
$arrTzCount[$value]++;
}else{
$arrTzCount[$value] = 1;
}
}
var_dump($arrSzCount);
var_dump($arrTzCount);
//判断字母是否相同以及出现次数是否相同
foreach ($arrSzCount as $key => $value) {
if(!isset($arrTzCount[$key])||$arrTzCount[$key] != $value){
return false;
}
}
//判断字母是否相同以及出现次数是否相同
foreach ($arrTzCount as $key => $value) {
if(!isset($arrSzCount[$key])||$arrSzCount[$key] != $value){
return false;
}
}
return true;
}
}
$obj = new Code();
$res = $obj->isZmyw('array','rraya');
var_dump($res);
执行结果如下:
思路2 :
使用一个int数组(长度为26),s字符串中出现此字符+1,t出现此字符-1,如果最终遍历数组的值均为0即t是s的字母异位词
class Code{
function isZmyw($s,$t){
//获取26个字母组成以字母为键,值为0的数组
$strZm = 'abcdefjhijklmnopqrstuvwxyz';
$arrResZm = str_split($strZm);
$arrZm = array();
foreach ($arrResZm as $key => $value) {
$arrZm[$value] = 0;
}
$arrS = str_split($s);
$arrT = str_split($t);
//若s字符串存在的字母,字母数组对应键值+1
foreach ($arrS as $key => $value) {
$arrZm[$value]++;
}
//若t字符串存在的字母,字母数组对应键值-1
foreach ($arrT as $key => $value) {
$arrZm[$value]--;
}
//最后字母数组所有键值若存在!=0 的情况,则表示s和t字符串字母种类和个数不同
foreach ($arrZm as $key => $value) {
if($value != 0){
return false;
}
}
return true;
}
}
$obj = new Code();
$res = $obj->isZmyw('array','rraya');
var_dump($res);
执行结果:
总结
思路1稍微有一点麻烦,但是算法思路比较通用
思路2比较简单,但是有一定局限性,假如字母的个数不是有限的怎么办?
网友评论