PHP 输入数据有多组,每组包含一个字符串s,最少需要删除多少个字符才能使字符串S变为回文串 ,输入需要删除的字符个数

大叔说码 2016-11-25 11:28:11
PHP 怎样实现以下问题:
输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000.
请问最少需要删除多少个字符才能使字符串S变为回文串 ,输入每组字符需要删除的字符个数?
这个算法怎么弄???
请大家贴个代码学习学习!
谢谢!!
...全文
800 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2016-11-26
  • 打赏
  • 举报
回复
/(.)(.*)\1/ (.) 匹配任意字符 \1 向前引用第一组匹配的的内容 (.) 和 \1 配合起来就是看看是否有字符重复出现了 相当于你的 if($str_arr[$i]==$str_arr[$j]) 只是你的 $i、$j 同进退,可能会造成漏判
大叔说码 2016-11-26
  • 打赏
  • 举报
回复
引用 5 楼 xuzuning 的回复:
$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
)
引用 5 楼 xuzuning 的回复:
$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
)
麻烦能写个注释解释一下吗?不会正则,以后要好好学一下正则才行, 谢谢!!!
xuzuning 2016-11-26
  • 打赏
  • 举报
回复
$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
)
大叔说码 2016-11-26
  • 打赏
  • 举报
回复
引用 3 楼 lanshs 的回复:
abcdedc
嗯嗯,果然还是有问题!!! 继续改! 你有什么好办法吗?
lanshs 2016-11-26
  • 打赏
  • 举报
回复
这个该怎么扩展 abcdefaedc
引用 10 楼 xuzuning 的回复:
aba 难道不是吗? 要最大回文串,你不会自己扩展吗?
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=引用 9 楼 lanshs 的回复:]
<?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 [quote=引用 5 楼 xuzuning 的回复:]
$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
)
[/quote][/quote]
lanshs 2016-11-26
  • 打赏
  • 举报
回复
abcdedc
xuzuning 2016-11-26
  • 打赏
  • 举报
回复
aba 难道不是吗? 要最大回文串,你不会自己扩展吗?
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};
}
引用 9 楼 lanshs 的回复:
<?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 [quote=引用 5 楼 xuzuning 的回复:]
$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
)
[/quote]
lanshs 2016-11-26
  • 打赏
  • 举报
回复
<?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
引用 5 楼 xuzuning 的回复:
$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
)
大叔说码 2016-11-26
  • 打赏
  • 举报
回复
引用 7 楼 xuzuning 的回复:
/(.)(.*)\1/ (.) 匹配任意字符 \1 向前引用第一组匹配的的内容 (.) 和 \1 配合起来就是看看是否有字符重复出现了 相当于你的 if($str_arr[$i]==$str_arr[$j]) 只是你的 $i、$j 同进退,可能会造成漏判
谢谢你的讲解!明白了, 找个时间我得学习下正则
大叔说码 2016-11-26
  • 打赏
  • 举报
回复
写了一个,暂时测试没什么问题,请大伙帮忙看看,谢谢!

/**
  * @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)
}
*/
大叔说码 2016-11-25
  • 打赏
  • 举报
回复
比如: 输入: abdeba google 输出: 1 2

21,887

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧