题目

最近在微信公众号里看看到了一个PPTV的面试算法题,感觉难度适中,想试下。题目的内容为求一个字符串的最长对称子字符串。如:
输入 输出
abba 4
abad 3
acccbaa 3

我的算法1

自己反复思索了许多时间。一开始是觉得可以利用对称字符串的一个特点,就是反转前后两者是一样的。所以有如下的算法:
最长子串长度为max_sub_len
* 1 把输入的字符串a,进行反转得到b
* 2 把b与a首尾对齐
* 3 找当前相同位置上a与b相同的元素,比如a[0]与b[0], a[1]与b[1],….,a[n]与b[n],找到最长连续相等的长度,记录此时最长的子串长度长度tmp_max_sub_len。取max_sub_len与tmp_max_sub_len中大者赋给max_sub_len。
* 4 把a左移动一位,如果已经到达a[n]与b[0]对齐时,退出.a[1]与b[0]对齐。重复第3步。
等到算法完成时,max_sub_len就是最长的子对称子串长度。
拿hello为例试下:
1,2
a = hello
b = olleh
3 找到a[2]=b[2]=l 最长连续相等为1
4
a = ello
b = olleh
3 找到a[1]=b[0] a[2]=b[1] 最长连接相等为2
4
a = llo
b = elleh
3 找到最长连续相等为1。
4
a = lo
b = elleh
3 找到最长连续相等数为0。
4
a = o
b = elleh
到达终点算法退出。得到最长对称子串长度为2。
时间复杂度:比较次数为n + (n-1) + (n-2) + … + 1 = n(n-1)/2 = O(n^2)
空间复杂度:可以通过索引的转化,实现只使用原数组。空间复杂度为O(n)

微信评论里的算法

有同学在评论里说,可以把反转后的a和b放在一起,求它们的最长公共子串。求最长公共子串的算法属于动态规划的算法,比较复杂,它的实现中,时间复杂度也是O(n^2)。没有我的算法1来得直接简单。具体实现我就不说了。

我的算法2

第一种算法算得上不错了。却不是最好的。因为它的时间复杂度n^2的系数为0.5,比较大。下面给出一种更好的算法。
对对称的情况进行分类。
奇对称的:aba类型的。
偶对称的:abba类型的。
第二种算法是根据两种类型的不同,以当前字符为中心向两侧辐射,比较对称两个字符。从而得到最长的对称子串。
不再描述其算法,直接上代码(我的github——algorithm_ds)。这种算法在最坏的情况下,是aaaaaaaaaaaa,全是一个字符的字符串。要比较n(n-1)次。正常随机输入的情况下,o(n^2)的系数是很小的。

#! /usr/bin/python
# -*- coding: utf-8 -*-'''
最长对称子字符串有两种形式
奇对称:abcba
偶对称:abccba
算法的时间复杂度为n^2
空间复杂度为n
'''
#写一个循环方便测试
while (True):max_sym_sub_len = 1max_single = 1 #奇对称最长子串max_double = 0 #偶对称最长子串raw_str = raw_input()#    pdb.set_trace()if raw_str == 'q': #退出break;if (len(raw_str) == 1):pass elif (len(raw_str) == 2):if (raw_str[0] == raw_str[1]): #长度为2,两个字符相等,最长子串为2max_sym_sub_len = 2else: #长度>3start_ind = 1 #从第2个字符开始判断tmp_ind = 0#奇对称的情形for start_ind in range(1, len(raw_str) - 1):max_single_tmp = 1# 判断当前的字符距离哪个端点更近tmp_range = min(start_ind, len(raw_str) - 1 - start_ind)# print start_ind, tmp_rangefor tmp_ind in range(1, tmp_range + 1):#开始判断,如果两侧的字符相等,临时最长的长度加2if (raw_str[start_ind - tmp_ind] == raw_str[start_ind + tmp_ind]):max_single_tmp += 2else:break;max_single = max(max_single, max_single_tmp)for start_ind in range(1, len(raw_str) - 1):max_double_tmp = 0# 判断当前的字符距离第一个字符,和当前字符的下个字符距离# 最后一个端点的距离中哪个更近tmp_range = min(start_ind, len(raw_str) - 2 - start_ind)# print start_ind, tmp_range# tmp_ind 应该从0开始for tmp_ind in range(tmp_range + 1):#开始判断,如果两侧的字符相等,临时最长的长度加2if (raw_str[start_ind - tmp_ind] == raw_str[start_ind + 1 + tmp_ind]):max_double_tmp += 2else:break;max_double= max(max_double, max_double_tmp)       max_sym_sub_len = max(max_single, max_double)print max_sym_sub_len

PPTV面试算法思考-最长对称子字符串相关推荐

  1. 程序员面试题精选100题(46)-对称子字符串的最大长度[算法]

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

  2. 最长对称字符串php_对称子字符串的最大长度

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

  3. 程序员面试100题之七:最长公共子字符串

    子字符串的定义和子序列的定义类似,但要求是连续分布在其他字符串中.比如输入两个字符串BDCABA和ABCBDAB的最长公共字符串有BD和AB,它们的长度都是2. 最长公共子字符串共有两种解决方法,下面 ...

  4. 程序员面试100题之七 最长公共子字符串

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 子字符串 ...

  5. 【编程题目】对称子字符串的最大长度 ★

    73.对称字符串的最大长度(字符串). 题目:输入一个字符串,输出该字符串中对称的子字符串的最大长度. 比如输入字符串"google",由于该字符串里最长的对称子字符串是" ...

  6. c语言字符串中取最大字符串,使用C语言提取子字符串及判断对称子字符串最大长度...

    先来看一个使用C语言从字符串中提取子字符串的基本方法总结: #include /*处理中文字符*/ /*遍历字符串,非ASCII字符读取2个字节,ASCII读取一个字节,获取字符串长度*/ int S ...

  7. python-又来练习题--输出一个字符串中最长的子字符串及其长度

    一.有个字符串 str= '$sd1#111$svda123!!!221&eSSDSyyyyyyDG^svda121^svda124^1111111111111' 包含特殊字符.数字和字母,输 ...

  8. leetcode算法题--最长公共子数组

    原题链接:https://leetcode-cn.com/problems/maximum-length-of-repeated-subarray/ 相似题目:最长公共子序列 只不过这里必须是连续的, ...

  9. leetcode算法题--最长湍流子数组

    原题链接:https://leetcode-cn.com/problems/longest-turbulent-subarray/ 相关问题:摆动序列 使用双dp保存状态. up[i]表示如果在i点是 ...

最新文章

  1. 【转】javascript中的LHS与RHS
  2. ​超越Transformer!AAAI 2021最佳论文:高效长序列预测模型
  3. java进制原码_Java 一一 进制、原码 反码 补码、移位操作
  4. L1-045. 宇宙无敌大招呼
  5. 【dfs】树上游戏(P2664)
  6. ASP.NET MVC5 之 分部页
  7. 文档丨Oracle 20c 概念手册
  8. 安装构建以太坊钱包Parity
  9. Netty入门(九)空闲连接以及超时
  10. 【Java方法】统计数组内不同元素个数及每个元素的数量
  11. 找零钱问题系列之记忆搜索
  12. 如何在 Web 前端做 3D 音效处理
  13. win7计算机锁频图片怎么设置,win7锁屏背景壁纸如何修改
  14. 华为交换机常用查询命令
  15. Google Chrome谷歌浏览器清除缓存以及清除Cookie快捷键
  16. cad插入块_CAD软件中图块无法分解怎么办?
  17. 域名显示服务器错误,域名解析出现错误是怎么回事?
  18. 水滴模式能否解惑10亿人口下沉市场?
  19. 2017-12-12
  20. 简单的Android程序多少钱,Android简单程序利息计算器

热门文章

  1. Scrapy框架实例-2(沪江网网课信息)
  2. 十六进制转八进制(十六进制转十进制,十进制转八进制)
  3. DNSPod十问李亚飞:小公司如何破解程序员的招聘迷局?
  4. c语言字符超过127,在C中处理超过127的char值
  5. 美团面试题:Hashmap的结构,1.7和1.8有哪些区别,史上最深入的分析
  6. Linux写文件断电保存,硬盘写到一半时断电,文件系统里会发生什么?
  7. 中国的三种特色团购创新模式
  8. HMS Core助力同程旅行,打造更贴心的用户出行体验
  9. 《致我们终将逝去的青春》经典语录
  10. 怎么用python制作随机点名软件_python写一个随机点名软件