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

2023-05-16

题目

最近在微信公众号里看看到了一个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 = 1
    max_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,两个字符相等,最长子串为2
            max_sym_sub_len = 2
    else: #长度>3
        start_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_range
            for tmp_ind in range(1, tmp_range + 1):
                #开始判断,如果两侧的字符相等,临时最长的长度加2
                if (raw_str[start_ind - tmp_ind] == raw_str[start_ind + tmp_ind]):
                    max_single_tmp += 2
                else:
                    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):
                #开始判断,如果两侧的字符相等,临时最长的长度加2
                if (raw_str[start_ind - tmp_ind] == 
                        raw_str[start_ind + 1 + tmp_ind]):
                    max_double_tmp += 2
                else:
                    break;
            max_double= max(max_double, max_double_tmp)       
    max_sym_sub_len = max(max_single, max_double)
    print max_sym_sub_len
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PPTV面试算法思考-最长对称子字符串 的相关文章

  • python_imbalanced-learn非平衡学习包_02_Over-sampling过采样

    python imbalanced learn非平衡学习包 01 简介 python imbalanced learn非平衡学习包 02 Over sampling过采样 后续章节待定 希望各位认可前面已更 您的认可是我的动力 Over s
  • TX2+JetPack3.2.1+opencv3.3.1+caffe+realsense2.0环境配置教程

    TX2 开箱 一共6样 xff0c 开机之后自带ubuntu16 04LTS的系统 xff0c ARMv8的处理器 xff0c 所以有些指令 xff0c 安装包必须与arm结构保持一致 开机之后 xff0c 按照指示进入图形界面 xff1a
  • 初视openwrt

    openwrt是一个微型的嵌入式操作系统 在编译的时候需要安装许多的工具和库 预置环境 xff1a sudo apt get install g 43 43 libncurses5 dev zlib1g dev bison flex unz
  • 滑动窗口详解

    前言 滑动窗口是双指针的一种特例 xff0c 可以称为左右指针 xff0c 在任意时刻 xff0c 只有一个指针运动 xff0c 而另一个保持静止 滑动窗口路一般用于解决特定的序列中符合条件的连续的子序列的问题 滑动窗口的时间复杂度是线性的
  • RT-Thread入门教程,环境配置和第一个代码

    1 前言 RT Thread这一个操作系统获得很多工程师的好评 xff0c 使用简单 xff0c 支持多 xff0c 有软件包可以下载 xff0c 甚至未来会有更多MicroPython的支持 xff0c 能够兼容主流的一些MCU xff0
  • DHT12温湿度传感器IIC,I2C接口调试心得和代码说明

    来源 xff1a http www fuhome net bbs forum php mod 61 viewthread amp tid 61 2141 DHT11那个单总线的温湿度传感器用的很多了 xff0c aosong推出了DHT12
  • 升级windows11如何在电脑上启用TPM2.0

    本文适用于无法升级到 Windows 11 xff0c 因为他们的电脑当前未启用 TPM 2 0 或其电脑能够运行 TPM 2 0 xff0c 但并未设置为运行 TPM 2 0 1 下载微软电脑健康状况检查 下载地址为 xff1a Wind
  • python调用谷歌翻译

    from GoogleFreeTrans import Translator if name 61 61 39 main 39 translator 61 Translator translator src 61 39 en 39 dest
  • C++(4) 运算符重载

    C 43 43 学习心得 xff08 1 xff09 运算符重载 from 谭浩强 C 43 43 面向对象程序设计 第一版 2014 10 6 4 1什么是运算符重载 用户根据C 43 43 提供的运算符进行重载 xff0c 赋予它们新的
  • C++学习心得(3)多态性与虚函数

    C 43 43 学习心得 xff08 3 xff09 多态性与虚函数 from 谭浩强 C 43 43 面向对象程序设计 第一版 2014 10 13 6 1 多态性的概念 在C 43 43 中 xff0c 多态性是指具有不同功能的函数可以
  • C发送http请求

    C语言发送http请求和普通的socket通讯 原理是一样的 无非就三步connect 连上服务器 send 发送数据 recv 接收数据 只不过发送的数据有特定的格式 下面的是简单发送一个http请求的例子 span class hljs
  • tensorflow(四十七):tensorflow模型持久化

    模型保存 span class token keyword from span tensorflow span class token keyword import span graph util graph def span class
  • git subtree使用

    在一个git项目下引用另一个项目的时 xff0c 我们可以使用 git subtree 使用 git subtree 时 xff0c 主项目下包含子项目的所有代码 使用 git subtree 主要关注以下几个功能 一个项目下如何引入另一个
  • tensorflow(四十八): 使用tensorboard可视化训练出的文本embedding

    对应 tensorflow 1 15版本 log dir span class token operator 61 span span class token string 34 logdir 34 span metadata path s
  • java中数组之间的相互赋值

    前言 本文考虑的研究对象是数组 xff0c 需要明确的是在java中 xff0c 数组是一种对象 xff0c java的所有对象的定义都是放在堆当中的 xff0c 对象变量之间的直接赋值会导致引用地址的一致 在java中声明一个数组 spa
  • tensorflow学习笔记(十):sess.run()

    session run fetch1 fetch2 关于 session run fetch1 fetch2 xff0c 请看http stackoverflow com questions 42407611 how tensorflow

随机推荐