首先还是先解释一下什么是回文串:就是从左到右或者从右到左读,都是同样的字符串。比如:上海自来水来自海上,bob等等。

那么什么又是找出最长回文串呢?

例如:字符串abcdefedcfggggggfc,其中efe,defed,cdefedc,gg,ggg,gggg,ggggg,gggggg,fggggggf,cfggggggfc都是回文串,左右完全一样。

这其中,有最短的gg,最长的cfggggggfc,还有其他长度的。忽略长度为1的。毕竟一个字符的都算回文了。

那么,找出最长的,就是找出这个cfggggggfc。

说实话,最开始想到的办法,就是暴力的枚举,也就是找出原字符串的所有子串,然后逐一判断是否是回文串,如果是就记录下来该字符串。

然后,碰到下一个回文串的时候,再对比两个字符串的长度,谁长,就把谁记录下来。

感觉遍历、枚举这类操作真的是万能的。。。

先来段暴力的代码,定个场。

通过两层循环,逐一筛选字符串的子串,找出所有回文串,并不断判断,记录最长的回文串

 function is_palindrome($str)
{
$strrev = strrev($str);// 逆序字符串
return $strrev == $str ? 1 : 0;
} function get_max_palindrome($str)
{
$len = strlen($str);
$res = '';// 结果
for ($i = 0; $i < $len - 2; $i++) {// $i 用于定义字符串起始位置,倒数第二个和最后一个如果还不能组成回文串,最后一个就不需要截取了
for ($j = $i + 2; $j <= $len; $j++) {// $j 用于逐一延长子字符串的长度,($j=$i+2)截取子串长度2位起,所以循环条件使用的是<=不是<
$tmp = substr($str, $i, $j - $i);// 逐一截取子串
if (is_palindrome($tmp)) {// 判断当前截取的子串是否是回文串
if (strlen($tmp) > strlen($res)) {// 是回文串,则再判断是否长度大于结果中保存的回文串
$res = $tmp;// 当前回文串大于结果中的,将结果变量更新成当前的回文串
}
}
}
}
return $res;
} $str = "abcdefedcfggggggfc";
echo get_max_palindrome($str);

这方法感觉还不错,简单直观,并且代码也算简单。就是会被鄙视,毕竟这个太初级,太暴力。越简单粗暴不是越好么?

简单粗暴的有了,有没有可以装一下的?有没有什么好玩的?有没有......于是就有了下边的程序。

 function get_max_palindrome1($str)
{
$len = strlen($str);
$res = [];// 结果数组
$res2= [];// 偶数长度的结果
// 使用array_unshift的目的是为了从前向数组插入每一次找到的答案。也可以直接更新单个元素数组,就是只要当前取到的字符串比原来的长,就把原来的覆盖掉
// 使用多维数组不是必须的,以为数组或者变量也可以。这里就是做一个简单的记录,可以微调一下,多完成另一个功能
array_unshift($res, $str[0]);// 默认将第一个字符作为最长回文串写入数组
array_unshift($res2, '');// 默认一个空字符串,长度为0,初始化 for ($i = 1; $i < $len - 1; $i++) {// 从第二个开始操作,因为第一个左边没有字符,只能算本身长度为1的回文串
// 针对奇数长度的最长回文串
$left = $right = $i;// 从中间向两边扩展,默认起始位置为中间的这个位置
$tmp = $str[$i];// 临时回文串,用于中间数据处理,默认是当前字符串
while ($left > 0 and $right < $len - 1) {// 限定,只要有任何一边到头,循环结束
$left--;// 左边向左扩展
$right++;// 右边向

最长(大)回文串的查找(字符串中找出最长的回文串)PHP实现的更多相关文章

  1. javascript实现:在N个字符串中找出最长的公子串

    'use strict' module.exports = function 找出最长公子串 (...strings) { let setsOfSubstrings = [] strings.redu ...

  2. hdu 1595 find the longest of the shortest【最短路枚举删边求删除每条边后的最短路,并从这些最短路中找出最长的那条】

    find the longest of the shortest Time Limit: 1000/5000 MS (Java/Others)    Memory Limit: 32768/32768 ...

  3. 输入n个字符串,找出最长最短字符串(若有个数相同的,都打印出来)

    首先,要求找到最长最短字符串,我们应该用数组将其存起来,输入的个数是不固定的,我们就可以用Scanner获取要输入的个数,最终找到的个数也不固定,我们可以封装两个方法,并且返回值类型为数组. 我遇到的 ...

  4. C#中的字符串处理——找出最长数字子串

    百度测试部2015年10月份的面试题之——字符串处理,找出最长的子串. 代码如下: private static string SelectNumberFromString(string input) ...

  5. ZT 查找字符串中连续最长的数字串

    查找字符串中连续最长的数字串 有俩方法,1)比较好理解一些.2)晦涩 1) /* 功能:在字符串中找出连续最长的数字串,并把这个串的长度返回, 并把这个最长数字串付给其中一个函数参数outputstr ...

  6. FCC JS基础算法题(3):Find the Longest Word in a String (找出最长单词)

    题目描述: 在句子中找出最长的单词,并返回它的长度.函数的返回值应该是一个数字. 基本思路,将字符串转换成数组,然后得出数组中单个元素的长度,对长度进行排序,返回最大的一个 代码: function ...

  7. 设在起始地址为STRING的存储空间存放了一个字符串(该串已存放在内存中,无需输入,且串长不超过99),统计字符串中字符“A”的个数,并将结果显示在屏幕上。

    问题 设在起始地址为STRING的存储空间存放了一个字符串(该串已存放在内存中,无需输入,且串长不超过99),统计字符串中字符"A"的个数,并将结果显示在屏幕上. 代码 data ...

  8. Javascript 查找字符串中出现最多的字符和出现的次数

    <script type="text/javascript"> //查找字符串中出现最多的字符和出现的次数 var str = 'Thatwheneying its o ...

  9. JS查找字符串中出现次数最多的字符

    本文给大家带来两种js中查找字符串中出现次数最多的字符,在这两种方法中小编推荐使用第二种,对js查找字符串出现次数的相关知识感兴趣的朋友一起看看吧   在一个字符串中,如 'zhaochucichuz ...

随机推荐

  1. java_基础_类加载

    类加载:Java命令的作用是启动虚拟机,虚拟机通过输入流,从磁盘上将字节码文件(.class文件)中的内容读入虚拟机,并保存起来的过程就是类加载. 类加载特性 :      *在虚拟机的生命周期中一个 ...

  2. echo 与 printf的区别与联系

    echo命令默认是带有换行符的. 如果想让echo命令去掉每一行后面的换行符 方法1; 如果确信自己的脚本程序只运行在bash上,可以使用如下语法来出去空格: echo -n "Is it ...

  3. Xcode 断点无用,也不打印输出

    原来是在main.m里使用了ptrace进行反调试. ptrace是系统用来对运行中的进程进行调试和跟踪的工具,通过ptrace,可以对另一个进程实现调试跟踪.但是里面提供了一个非常有用的参数,就是P ...

  4. linux安装elk

    环境: centOS7 JDK8 Elasticsearch-6.6.1 Logstash-6.6.1 Kibana-6.6.1 准备: jdk下载地址:https://www.oracle.com/ ...

  5. 【托业】【跨栏】TEST06

    26-30 26 27 28 28 29 30

  6. npm手册

    npm现在都是随同NodeJS一起安装的包管理和分发工具,所以npm的安装,只要下载新版的nodejs已经集成了npm. 安装好了以后,直接输入npm或者npm help,会出来一些npm自带的命令. ...

  7. sudo:无法解析主机

    原因:替换了hosts文件(之前用了google hosts) 或者更改了主机名称 解决办法:$ pkexec nano /etc/hosts 加入 127.0.1.1  xxxx XXX为主机名字即 ...

  8. nginx解决跨域

    location ~* \.(eot|ttf|woff|woff2|svg)$ { add_header Access-Control-Allow-Origin *; add_header Acces ...

  9. MySql 版本

    MySql 版本: netformwork 2.0 netformwork 4.0

  10. 《ASP.NET Core In Action》读书笔记系列四 创建ASP.NET Core 应用步骤及相应CLI命令

    一般情况下,我们都是从一个模板(template)开始创建应用的(模板:提供构建应用程序所需的基本代码).本节使用 Visual Studio 2017 .ASP.NET Core2.0和 Visua ...