21,887
社区成员
发帖
与我相关
我的任务
分享
$a = array(
'abcda',
'gcoabogle',
'abcd',
'abcdedc',
);
foreach($a as $s)
echo Palindrome($s), PHP_EOL;
function Palindrome($s) {
if(preg_match('/(.)(.*)\1/', $s, $m)) {
return $m[1] . Palindrome($m[2]) . $m[1];
}
return $s{0};
}
aba
goaog
a
cdedc
其实大可不必自己给自己找麻烦。函数就应完成单一功能
如果需要处理一组数据,又不想在调用时有循环。那么 php 已经提供了方便的工具$b = array_map('Palindrome', $a);
print_r($b);
Array
(
[0] => aba
[1] => goaog
[2] => a
[3] => cdedc
)
function Palindrome($s) {
if(preg_match_all('/(.)(.*)\1/', $s, $m)) {
$len = array_map('strlen', $m[2]);
$n = array_search(max($len), $len);
return $m[1][$n] . Palindrome($m[2][$n]) . $m[1][$n];
}
return $s{0};
}
[/quote]<?php
echo Palindrome('abacdefedc'), PHP_EOL;
function Palindrome($s) {
if(preg_match('/(.)(.*)\1/', $s, $m)) {
return $m[1] . Palindrome($m[2]) . $m[1];
}
return $s{0};
}
aba
最大回文串 cdefedc
/**
* @params array $arr 多组字符串
* return array 返回对应需要去掉的字符个数
**/
function huiwen($arr) {
// 判断数组是否为空
if(count($arr)<=0) {
return false;
}
foreach($arr as $k=>$v) {
// 判断该单元的字符串的长度是否小于等于1,如是则说明需要去掉0个字符
if(mb_strlen($v,'utf-8')<=1) {
$new_arr[$k] = 0;
continue;
}
$str_arr = str_split($v,1); // 将字符串以每一段长度为1方式转换为数组
$str_len = count($str_arr); // 计算数组长度
// 定义并初始化游标i=0,j=len-1,分别指向字符串开头和末尾;
for($i=0,$j=$str_len-1;$i<=$j;) {
// 判断$str_arr[$i]==$str_arr[$j],如相等,就把两者放入一个新数组中
if($str_arr[$i]==$str_arr[$j]) {
if($i!=$j) {
$new_arr[$k][$i] = $str_arr[$i];
$new_arr[$k][$j] = $str_arr[$j];
} else { // 如果都是指向同一个单元,则把任意一个单元存入数组中
$new_arr[$k][$i] = $str_arr[$i];
}
// 接着把头部下标加1,尾部下标减1,进行下一对的比较
$i++;
$j--;
} else { // 如果$str_arr[$i]!=$str_arr[$j],则尾部下标减一,继续和数组的第一个单元比较
$j--;
}
}
//这时得到的$new_arr就是回文字符串以","为分割符形成的数组形式,这里根据键名排序一下方便观察,
ksort($new_arr[$k]);
// var_dump($new_arr);
$new_len = count($new_arr[$k]); // 计算得到回文的长度
$new_arr[$k] = $str_len-$new_len; // 计算并返回需要去掉的字符个数
}
return $new_arr;
}
$arr = array('abcda','google');
var_dump(huiwen($arr));
/*
打印结果:
array(2) {
[0]=>
int(2)
[1]=>
int(2)
}
*/