首先还是先解释一下什么是回文串:就是从左到右或者从右到左读,都是同样的字符串。比如:上海自来水来自海上,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. pta第一次总结

    1).实验代码 include<stdio.h> int main() { int n,i,j,a1,a2,b1,b2,sum,x,k; char c; while(~scanf(&quo ...

  2. 在多个平台如何安装Python

    最近的一个项目,架构师米洛需要用的mqtt,服务器开发的时候,竟然用的python脚本.运行python就需要安装开发环境,好吧,百度一下就知道了大神廖雪峰.以下部分测试通过,转载记录如下. 因为Py ...

  3. linux sed 用法

    目录 Overview 命令行选项 Command-Line Options manual http://www.gnu.org/software/sed/manual/sed.html Overvi ...

  4. oracle 约束与索引

    1.约束 1.not null(列表不为空) create table 表名(列名1 列表属性2 not null,列名1 列表属性2 not null); 2.unique(列表不能重复) crea ...

  5. CF1093F Vasya and Array

    题目链接:洛谷 以后还是要多打CF,不然就会错过这些很好的思维题了.我dp学得还是太烂,要多总结. 首先$len=1$就直接输出0. 我们考虑$dp[i][j]$表示前$i$个数的答案,而且第$i$个 ...

  6. pandas(二)

    层级索引: index=[('a',2010),('b',2011),('c',2010'),('a',2012),('e',2010),('f',2011)] age=[18,17,18,16,18 ...

  7. 改造一下jeecg中的部门树

    假装有需求 关于 jeecg 提供的部门树,相信很多小伙伴都已经用过了,今天假装有那么一个需求 "部门树弹窗选择默认展开下级部门",带着这个需求再次去探索一下吧. 一.改造之前的部 ...

  8. mysql-8.0.13在windows上的部署

    1 .下载mysql-8.0.13-x64 官方网站:https://dev.mysql.com/downloads/mysql/ 2.解压到G盘 3.准备my.ini文件保存到解压目录 [mysql ...

  9. pyothon学习笔记2-元组

    # 1.元组对象不可修改,元组中列表对象的对象可以修改 t = (1,2,[1,2,3]) t[2] = [1,2,3,4] # 'tuple' object does not support ite ...

  10. OFFICE 您正试图运行的函数包含有宏或需要宏语言支持的内容。

    故障现象:打开WORD的时候,提示“您正试图运行的函数包含有宏或需要宏语言支持的内容.而在安装此软件时,您(或您的管理员)选择了不安装宏或控件的支持功能”. 提示现象: 解决办法 : 1.进入“控制面 ...