最长(大)回文串的查找(字符串中找出最长的回文串)PHP实现
首先还是先解释一下什么是回文串:就是从左到右或者从右到左读,都是同样的字符串。比如:上海自来水来自海上,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实现的更多相关文章
- javascript实现:在N个字符串中找出最长的公子串
'use strict' module.exports = function 找出最长公子串 (...strings) { let setsOfSubstrings = [] strings.redu ...
- 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 ...
- 输入n个字符串,找出最长最短字符串(若有个数相同的,都打印出来)
首先,要求找到最长最短字符串,我们应该用数组将其存起来,输入的个数是不固定的,我们就可以用Scanner获取要输入的个数,最终找到的个数也不固定,我们可以封装两个方法,并且返回值类型为数组. 我遇到的 ...
- C#中的字符串处理——找出最长数字子串
百度测试部2015年10月份的面试题之——字符串处理,找出最长的子串. 代码如下: private static string SelectNumberFromString(string input) ...
- ZT 查找字符串中连续最长的数字串
查找字符串中连续最长的数字串 有俩方法,1)比较好理解一些.2)晦涩 1) /* 功能:在字符串中找出连续最长的数字串,并把这个串的长度返回, 并把这个最长数字串付给其中一个函数参数outputstr ...
- FCC JS基础算法题(3):Find the Longest Word in a String (找出最长单词)
题目描述: 在句子中找出最长的单词,并返回它的长度.函数的返回值应该是一个数字. 基本思路,将字符串转换成数组,然后得出数组中单个元素的长度,对长度进行排序,返回最大的一个 代码: function ...
- 设在起始地址为STRING的存储空间存放了一个字符串(该串已存放在内存中,无需输入,且串长不超过99),统计字符串中字符“A”的个数,并将结果显示在屏幕上。
问题 设在起始地址为STRING的存储空间存放了一个字符串(该串已存放在内存中,无需输入,且串长不超过99),统计字符串中字符"A"的个数,并将结果显示在屏幕上. 代码 data ...
- Javascript 查找字符串中出现最多的字符和出现的次数
<script type="text/javascript"> //查找字符串中出现最多的字符和出现的次数 var str = 'Thatwheneying its o ...
- JS查找字符串中出现次数最多的字符
本文给大家带来两种js中查找字符串中出现次数最多的字符,在这两种方法中小编推荐使用第二种,对js查找字符串出现次数的相关知识感兴趣的朋友一起看看吧 在一个字符串中,如 'zhaochucichuz ...
随机推荐
- css页面字体替换源代码和页面显示不一样问题解决
2018年8月27日19:58:12 css指定字体的时候,可以自制的字体,比如字符替换,比如 0没有被替换,其他在源代码被替换对应的字母,但是现实的时候在替换成正确的数字 很简单,防爬虫,但是... ...
- MyCP-实现文件的复制以及进制转换
MyCP 一.设计思路 确定MyCP的要求 根据需求可知MyCP需要实现类似Linux下cp XXX1 XXX2的功能,且需要支持两个参数: java MyCP -tx XXX1.txt XXX2.b ...
- js_js流程控制
1.表达式.语句 2.流程控制 顺序 分支 循环 分支 循环结构都有一个条件 循环结构:重复做一件事 3元运算符 switch语句(用来做相等性判断--优先考虑) 注意: 1.switch ...
- querySelector与getElementBy的区别
1,querySelector() 方法返回匹配指定 CSS 选择器元素的第一个子元素 . 该方法只返回匹配指定选择器的第一个元素.如果要返回所有匹配元素,需要使用 querySelectorAll( ...
- nanoPI编译内核的一些record
我用的nanopi型号为 nanopi NEO,本来想拿来跑一跑需要usb串口读数据的golang程序,NEO居然没有该内核驱动的配置. 官方wiki:http://wiki.friendlyarm. ...
- Typora极简教程
Typora极简教程 ” Markdown 是一种轻量级标记语言,创始人是约翰·格鲁伯(John Gruber).它允许人们 “使用易读易写的纯文本格式编写文档,然后转换成有效的 HTML 文档.” ...
- Azure架构(一):云计算基础
云计算的定义 云计算(英语:cloud computing),是一种基于互联网的计算方式,通过这种方式,共享的软硬件资源和信息可以按需求提供给使用各种计算终端(桌面电脑.笔记本电脑.平板电脑.手机等) ...
- gdb调试android
手机端 adb shell gdbserver --mulit *:23333 /data/local/tmp/test 电脑 target remote 192.168.1.170:23333
- Google word/sheets 常见的使用:
Google Sheets: 1, sheets 里面的单元格设置自动换行: 选中单元格: --> Format --> Text Wrapping --> Wrap(自动换行)/C ...
- Vmworkstation启用错误
无法打开内核设备"\\.\Global\vmx86":系统找不到指定的文件. 是否在安装 VMwareWorksation 后重新引到 ? 问题解决 无法连接 MKS:套接字连 ...