2019独角兽企业重金招聘Python工程师标准>>>

常见算法基础题思路简析(六)-字符串篇

标签: algorithms


[TOC]


本文对和 字符串 有关的常见算法基础题思路分类进行分析和总结,并以 Java 为例,适当指出需要注意的编程细节

  • 相关题目和代码在 GitHub: https://github.com/brianway/algorithms-learning
  • 题目见 com.brianway.learning.algorithms.lectures.string

最长无重复字符子串

题目见 DistinctSubstring

思路:对于每个字符,向左延伸找无重复子串,要知道该字符(记为 s[i])上次在哪个位置出现过,还要知道之前其他字符中出现过重复且最近一次出现重复的那个位置 pre,则以 s[i] 结尾的向左最长无重复的长度为: s[i] 上次出现位置和 pre 中较大者到现在 s[i] 的距离。

//例子1
i:0 1 2 3 4 5
s:b a c b a di=4 => s[4] = a, pre = 0(b 重复了),map[a] = 1(a 上次出现在 i=1)=> cur = 4-1 = 3, 即 cba
i=5 => s[5] = d, pre = 1(a 重复了), map[d] = -1=> cur = 5-1 =4, 即 cbad//例子2
i:0 1 2 3 4 5
s:a b c b a di=4 => s[4] = a, pre = 1(b 重复了), map[a] = 0(a 上次出现在 i=0)=> cur = 4-1 = 3, 即 cba
i=5 => s[5] = d, pre = 1(b 重复了), map[d] = -1=> cur = 5-1 =4, 即 cbad
  • 使用一个哈希表 map[256] 来记录每种字符之前最新出现过的位置。
  • 使用一个整型变量 pre 来记录以 s[i-1] 结尾的字符串向左延伸且无重复字符时的最左下标(不包括该下标)。

对字符串中每个字符 s[i] 进行如下操作:

  1. 对字符串中每个字符,找出 premap[s[i]] 中的较大值并更新为 pre
  2. 以当前字符 s[i] 结尾向左无重复的长度则为 cur = i - pre
  3. 根据这个 cur 和历史最大长度比较,更新最大长度
  4. 更新 map[s[i]] 为 i

注意:

  • map 中每个元素和 pre 均初始值为 -1
  • 有个现象:当未出现过某字符且字符均未出现过重复时,premap[s[i]] 均为 -1, cur = i+1,cur 随 i 递增

拓扑结构相同子树

题目见 IdenticalTree

思路:

  1. 使用特殊格式打印的二叉树中序遍历结果时唯一的,打印两个树的中序遍历字符串
  2. 使用 KMP 算法进行子串匹配,能匹配则

注意:

  • 中序遍历时,空节点也要打印,所有值要以特殊字符结尾以免歧义
  • KMP 的原理、实现以及小优化
    • 字符串匹配的KMP算法
    • 从头到尾彻底理解KMP

合法括号序列

题目见 Parenthesis

思路:每个右括号出现时必已有一个左括号与之对应,计数即可,正负抵消。对每个元素进行如下操作:

  1. 遇到非括号字符返回 false
  2. 遇到左括号则计数器加一
  3. 遇到右括号则计数器减一,计数器为负值则返回 false
  4. 循环结束计数器值为零则 true,否则 false

拼接最小字典序

题目见 Prior

思路:排序不是以单个字符串来比较,而是把待比较的两个字符串(记为 sa 和 sb)拼接起来进行比较,即比较 sa+sb 和 sb+sa 的字典序

注意:

  • 由于两个串无论什么顺序拼接,拼接后字符串长度相同,所以无论谁在前,拼接后的串对其他字符串影响是一致的

空格替换

题目见 Replacement

思路:

  1. 先统计下空格数量,分配空间
  2. 直接逐个字符复制,遇到空格就替换即可

注意:

  • 新的字符串长度为 length + 2 * count,length 为原字符串长度, count 为空格个数,%20比空格多了两个字符

句子逆序

题目见 Reverse

思路:

  1. 先对整个字符串反转
  2. 再对以空格分隔的每个单词反转

注意:

  • 能做到 in place 反转,无需额外空间,有点像“负负得正”
  • 每个单词反转是以其末尾的空格触发的,所以对最后一个单词,需要单独判断处理

两串旋转

题目见 Rotation

思路:

  1. 判断两串是否长度相等
  2. 将原串与自身拼接,看另一字符串是否是拼接串的子串即可

词语变形

题目见 Transform

思路:

  1. 判断两串长度是否相等
  2. 遍历 A 串,统计 A 串中每种字符出现的次数(计数累加)
  3. 遍历 B 串,做 2 中的统计结果做减法,若 B 中出现了 A 中未出现的字符或者 B 中某种字符出现次数比 A 多(表现形式为:减 1 前 counts[b[i]] == 0),返回 false,否则 true

注意:

  • 遍历 B 串不是计数累加而是利用 A 的结果

字符串移位问题

题目见 Translation

思路:以移位长度为分界点,分别将各部分对其中轴线做镜像反转,再对整个字符串以其中轴线做镜像反转。

  1. 将下标 0 ~ len-1 的字符反转
  2. 将下标 len ~ n-1 的字符反转
  3. 将整个字符串 0 ~ n-1 反转

注意:

  • 无需申请额外空间
  • 各部分做了两次镜像反转,所以内部保持相对顺序不变

作者@brianway更多文章:个人网站 | CSDN | oschina

转载于:https://my.oschina.net/brianway/blog/1545144

常见算法基础题思路简析(六)-字符串篇相关推荐

  1. 【路径规划】A*算法方法改进思路简析

    A*算法方法改进思路简析 0. 前言 1. A*算法的总体流程 2. A*算法的改进 2.1 启发函数的选择与优化 2.1.1 预估函数的选择 2.1.2 为启发函数增加权重系数 2.1.3 节点比较 ...

  2. 学python前端需要哪些基础知识_简析前端学习python3的基础

    以下是整理的JavaScript和python的基础区别的整理: 字符串.列表.元组.字典.集合.函数 字符串 声明一个字符串 python str = '123' str = "123&q ...

  3. 算法基础题:木棍切割问题

    本文章参考https://blog.csdn.net/qq_30432997/article/details/85283294 为下列问题设计一个动态规划算法.已知小木棍的销售价格pi和长度i相关,i ...

  4. 公安视频监控系统建设存在问题及系统规划思路简析

     导语:近年来,随着各地视频监控系统建设规模的扩大,公安业务对视频依靠程度的不断提升,视频监控图像信息的应用成为公安机关治安防范.打击犯罪和指挥通信的重要手段.但在公安视频监控系统建设中,存在的几 ...

  5. Adaboost算法与应用实例简析

    Adaboost 算法wiki简介 AdaBoost,是英文"AdaptiveBoosting"(自适应增强)的缩写,是一种机器学习方法,由YoavFreund和RobertSch ...

  6. 【算法基础】数据结构导论第六章-查找.pptx

    上课的课件分享,适合教学用. 文末提供下载 已发布: 数据结构导论第一章-绪论 数据结构导论第二章-线性表 数据结构导论第三章-栈.队列和数组 数据结构导论第四章-树 数据结构导论第五章-图 本文参考 ...

  7. 网络协议基础:ARP简析

    ARP为IP地址到对应的硬件地址之间提供动态映射.RARP是被那些没有磁盘驱动器的系统使用(一般是无盘工作站或X终端),它需要系统管理员进行手工设置. AD:WOT2015 互联网运维与开发者大会 热 ...

  8. 全局变量、局部变量、静态全局变量、静态局部变量的区别(与常见面试基础题)

    1.局部变量能否和全局变量重名?  答:能,局部会屏蔽全局.要用全局变量,需要使用 ":: "  局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用 ...

  9. Retrofit网络请求框架使用简析——Android网络请求框架(四)

    题记:-- 很累,累到想要放弃,但是放弃之后将会是一无所有,又不能放弃, 唯有坚持,唯有给自忆打气,才能更勇敢的走下去,因为无路可退,只能前行, 时光一去不复返,每一天都不可追回,所以要更珍惜每一存光 ...

最新文章

  1. 用Visual C#创建Windows服务程序
  2. 总结一下对buffer的学习体会
  3. [svn] linux 下svn服务器的搭建
  4. logging模块的使用
  5. Octave中无法使用rgb2gray()函数
  6. 【版本更新】IM 4.3.0新版本升级上线!
  7. react入门--------安装react
  8. linux下安装glibc-2.14,解决“`GLIBC_2.14' not found”问题
  9. CCNP-第四篇-OSPF高级版(一)
  10. 日志级别动态调整——小工具解决大问题
  11. HTML期末作业-网上书城网上书店
  12. Spring : @EnableConfigurationProperties注解
  13. ubuntu19.04安装pip3以及virtualenv和virtualenvwrapper
  14. unity2018设置雾在哪_《Babel》项目技术整理:雾
  15. 新SQL Server 2016示例数据库
  16. Python闭包装饰器笔记
  17. 租房管理系统计算机课程设计,基于WEB的房屋出租管理系统的设计与实现
  18. scnaf使用格式化字符串%d接受小数的情况
  19. 山科大数字高程模型(朱红春版)复习 2021
  20. 云服务器和VPS有什么区别?

热门文章

  1. Android Studio如何隐藏系统的状态栏
  2. cesium 模型绕点飞行一周
  3. python中execute函数_在excel中调用python函数
  4. 如何让debuge的dll名字改变_杨石头:如何给品牌取个好名字?
  5. linux 无线 扫描不到网络,在Ubuntu笔记本上搜不到无线信号的解决办法
  6. linux mysql多实例启动_Mysql实例Linux下启动多个mysql服务器例子
  7. C++轻量级微服务_微服务的部署
  8. php mysql zend linux,Linux系统安装配置PHP+MySQL+zend+PHPadmin开发环境
  9. 相分离相关文章阅读Cancer-Specific Retargeting of BAF Complexes by a Prion-like Domain
  10. 数据结构设计_数据结构算法设计题学起来很困难怎么破