题目:输入一个字符串,输出该字符串中对称的子字符串的最大长度。比如输入字符串“google”,由于该字符串里最长的对称子字符串是“goog”,因此输出4。

http://zhedahht.blog.163.com/blog/static/25411174201063105120425/

引子:判断字符串是否对称

要判断一个字符串是不是对称的,不是一件很难的事情。我们可以先得到字符串首尾两个字符,判断是不是相等。如果不相等,那该字符串肯定不是对称的。否则我们接着判断里面的两个字符是不是相等,以此类推。

解法一:O(n3)的算法

现在我们试着来得到对称子字符串的最大长度。最直观的做法就是得到输入字符串的所有子字符串,并逐个判断是不是对称的。如果一个子字符串是对称的,我们就得到它的长度。这样经过比较,就能得到最长的对称子字符串的长度了。

#include

#include

#include

using namespace std;

char str1[10003];

//char str2[1002];

int main()

{

bool IsSymmetrical(char *pBegin,char *pEnd);

int GetLongestSymmetricalLength_1(char *pString);

while(gets(str1))

{

cout<

}

return 0;

}

// Whether a string between pBegin and pEnd is symmetrical

bool IsSymmetrical(char *pBegin,char *pEnd)

{

if(pBegin==NULL||pEnd==NULL||pBegin>pEnd) return false;

while(pBegin

{

if(*pBegin!=*pEnd) return false;

pBegin++;

pEnd--;

}

return true;

}

// Get the longest length of its all symmetrical substrings

// Time needed is O(T^3)

int GetLongestSymmetricalLength_1(char *pString)

{

if(pString==NULL) return 0;

int symmetricalLength=1;

char *pFirst=pString;

int length=strlen(pString);

while(pFirst

{

char *pLast=pFirst+1;

while(pLast<=&pString[length-1])

{

if(IsSymmetrical(pFirst,pLast))

{

int newLength=pLast-pFirst+1;

if(newLength>symmetricalLength) symmetricalLength=newLength;

}

pLast++;

}

pFirst++;

}

return symmetricalLength;

}

时间效率:由于我们需要两重while循环,每重循环需要O(n)的时间。另外,我们在循环中调用了IsSymmetrical,每次调用也需要O(n)的时间。因此整个函数的时间效率是O(n3)。

仔细分析上述方法的比较过程,我们就能发现其中有很多重复的比较。假设我们需要判断一个子字符串具有aAa的形式(A是aAa的子字符串,可能含有多个字符)。我们先把pFirst指向最前面的字符a,把pLast指向最后面的字符a,由于两个字符相同,我们在IsSymtical函数内部向后移动pFirst,向前移动pLast,以判断A是不是对称的。接下来若干步骤之后,由于A也是输入字符串的一个子字符串,我们需要再一次判断它是不是对称的。也就是说,我们重复多次地在判断A是不是对称的。

造成上述重复比较的根源在于IsSymmetrical的比较是从外向里进行的。在判断aAa是不是对称的时候,我们不知道A是不是对称的,因此需要花费O(n)的时间来判断。下次我们判断A是不是对称的时候,我们仍然需要O(n)的时间。

解法二:O(n2)的算法

换一种思路,我们从里向外来判断。也就是我们先判断子字符串A是不是对称的。如果A不是对称的,那么向该子字符串两端各延长一个字符得到的字符串肯定不是对称的。如果A对称,那么我们只需要判断A两端延长的一个字符是不是相等的,如果相等,则延长后的字符串是对称的。因此在知道A是否对称之后,只需要O(1)的时间就能知道aAa是不是对称的。

#include

#include

#include

using namespace std;

char str1[10003];

int main()

{

int GetLongestSymmetricalLength_2(char *pString);

while(gets(str1))

{

cout<

}

return 0;

}

// Get the longest length of its all symmetrical substrings

// Time needed is O(T^2)

int GetLongestSymmetricalLength_2(char *pString)

{

if(pString==NULL) return 0;

int symmetricalLength=1;

char *pChar=pString;

while(*pChar!='\0')

{

// Substrings with even length

char *pFirst=pChar;

char *pLast=pChar+1;

while( (pFirst>=pString) && (*pLast!='\0') && (*pFirst==*pLast) )

{

pLast++;

pFirst--;

}

int newLength=pLast-pFirst-1;

if(newLength>symmetricalLength) symmetricalLength=newLength;

// Substrings with odd length

pFirst=pChar-1;

pLast=pChar+1;

while( (pFirst>=pString) && (*pLast!='\0') && (*pFirst==*pLast) )

{

pFirst--;

pLast++;

}

newLength=pLast-pFirst-1;

if(newLength>symmetricalLength) symmetricalLength=newLength;

pChar++;

}

return symmetricalLength;

}

最长对称字符串php_对称子字符串的最大长度相关推荐

  1. 力扣311场周赛:最长的字母序连续子字符串的长度

    本文以python为编程语言,题目来源于力扣311届周赛 题目: 字母序连续字符串是由字母表中连续字母组成的字符串.换句话说,字符串 "abcdefghijklmnopqrstuvwxyz& ...

  2. C++horspool算法查找字符串是否包含子字符串(附完整源码)

    C++horspool算法查找字符串是否包含子字符串 C++Shorspool算法查找字符串是否包含子字符串完整源码(定义,实现,main函数测试) C++Shorspool算法查找字符串是否包含子字 ...

  3. php获取两个字符,php获取两个字符串之间的子字符串

    指定原始字符串,给定开始和结尾字符串,获得这两个字符串之间的子字符串的php函数 /** * Returns the substring between two strings, delimiters ...

  4. Python在字符串中查找子字符串

    这是小白博主在刷leetcode时遇到的一道题,这是博主近日刷的leetcode题库时结果表现最好的一道题,故在此分享这份喜悦. 希望在以后的日子里可以继续进步,持之以恒. 目录 题目介绍 解题思路及 ...

  5. 动态规划算法分析和理解:最长公共子序列、公共子字符串

    定义啥的就不多说了,反正我有自己的理解就行.例题是,最长公共子序列和最长公共子字符串的动态规划求解过程 目录 一.递归和动态规划 二.动态规划求解步骤 三.最长公共子序列 四.最长公共子字符串 一.递 ...

  6. [字符串]重复的子字符串

    一.题目描述 原文链接:459. 重复的子字符串 具体描述: 给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成. 示例 1: 输入: s = "abab" 输 ...

  7. c语言 字符串 if,C语言用if(strstr(s1,s2))判断字符串是否存在子字符串,无论有没有都会进入到if里是怎么回事?...

    代码作用是首先得到5行数字字符串 然后得到一个想要查找的重复数字型子字符串的长度和数字,比如长度3,数字0,就是查找'000′ 然后判断第几行有子字符串,打印出来 我现在的问题是--不管有没有,返回结 ...

  8. C语言strstr()函数(在主字符串里查找子字符串,返回第一次找到的子字符串以及后面的字符串)

    需包含头文件:C 标准库 - <string.h> 文章目录 描述 声明 参数 返回值 实例 描述 C 库函数 char *strstr(const char *haystack, con ...

  9. 拆分字符串使唯一子字符串的数目最大

    思路: 方法一:回溯 拆分给定的字符串,要求拆分后的每个子字符串唯一,求子字符串的最大数目,可以通过回溯算法实现. 对于长度为 n的字符串,有n−1个拆分点.从左到右遍历字符串,对于每个拆分点,如果在 ...

最新文章

  1. CloudStack Ctrix官网版本
  2. 开源杀毒引擎 ClamAV
  3. Exception in thread main java.lang.NoClassDefFoundError: org/apache/tez/dag/api/TezConfiguration
  4. 图卷积神经网络_深度层次化图卷积神经网络
  5. 全国计算机等级考试题库二级C操作题100套(第06套)
  6. Android之解决ScrollView包裹了两个RecyclerView导致滑动冲突问题
  7. autojs定时可以选定日期吗_微信怎么定时发送朋友圈——软件教程
  8. Psych112R Cognitive Robotics Midterm Laboratory
  9. php 监控nginx日志,nginx启用status监控服务器状态的方法详解
  10. [2011诺贝我物理奖]超新星与暗能量的收现
  11. 开课吧:为什么指针被誉为C语言灵魂?
  12. 【linux高级程序设计】(第十一章)System V进程间通信 1
  13. 关于qt+vs2019报错的奇葩问题,无法定位程序输入点
  14. 图文详解!java高级工程师简历模板
  15. APISpace 空号检测API接口 免费好用
  16. Oracle 监控索引使用率脚本分享
  17. ppt里面如何插入表格
  18. 暴雪定不负我?(20220123 Week3-3)
  19. 关于CDN和DNS技术的解析以及搭建智能DNS的方法
  20. 骞云科技 python_骞云科技SmartCMP6.0版本正式发布!

热门文章

  1. Cisco Packet Tracer_实验四_使用两台二层交换机配置vlan
  2. python 正则匹配 条件太多怎么办_Python中正则表达式的巧妙使用
  3. ubuntu使用docker搭建licode
  4. 阿里云Ubuntu搭建Steam饥荒联机版服务器
  5. pregel 与 spark graphX 的 pregel api
  6. 用python实现阿里云ecs和redis的创建与维护
  7. Contextual Related Posts插件不起作用
  8. 微信小程序 输入框 input 组件
  9. 【分治法】中位数问题和Gray码问题——武汉理工大学算法分析与设计课程实验
  10. AST逆向实战|5s盾混淆代码还原思路及采坑实录