代码随想录算法训练营第九天| | 字符串总结 | | 双指针回顾

代码随想录算法训练营第九天| | 字符串总结 | | 双指针回顾

字符串总结

  • 什么是字符串
    • 若干字符的有限序列
    • c语言中,把字符串存入数组时,会以'\0'结尾标志
    • java中,String是不可修改的字符串,StringBuilder是可以修改的字符串,其中许多增删改查的方法
  • 要不要使用库函数
    • 直接使用库函数就可以解决的题,不建议使用
    • 库函数只是解题的一小部分,且明白内部实现原理,能够分析出其时间复杂度,可使用
  • 双指针法
    • 在数组和链表中都有较广泛的使用
    • 移除元素就可以使用双指针法实现 O ( n ) O(n) O(n)的时间复杂度
    • 解决数组填充的问题时,可以先预先扩容,然后在从后向前操作(从后边开始,左指针不断给右指针赋值,当遇到替换元素,就右指针赋值相应的数据)
  • 反转系列
    • 在处理翻转单词、翻转字符串的时候,如果一次反转行不通,我们可以考虑整体反转+局部反转的方法
    • 在处理分段字符串的时候,我们可以在for循环中,一次循环处理一段字符(i += k)
  • KMP算法(先初步了解,有时间再详细学习)
    • KMP的精髓
      • 什么是KMP
      • 什么是前缀表,前缀表怎么求,为什么要用前缀表
    • KMP解决的问题
      • 匹配问题
      • 重复子串问题
    • KMP的前缀表多个版本
      • next[0] = -1版本
      • next[0] = 0 版本

双指针( O ( n 2 ) O(n^2) O(n2)—> O ( n ) O(n) O(n)

  • 数组篇
    • 数组中移除元素问题,不要使用库方法来移除,会得到n方的复杂度
    • 只需要一个循环中使用双指针即可实现(实质就是一个不断复制的过程,快指针在前复制非移除元素的数据给慢指针)
  • 字符串篇
    • 反转字符串
      • 前后向中间的双指针来反转
    • 替换空格
      • 先填充再移动
      • 使用从后向前的双指针,而不是用从前向后:后者每次都得替换都得整体往后移动字符串,得到n方时间复杂度
    • 移除元素
      • 和数组处理差不多
  • 链表篇
    • 链表反转:只需改变next的指向,不用多余空间
    • 求链表的环:使用快慢指针,结合数学方程推导得出相关位置情况
  • N数之和篇
    • 两数之和其实也可以用双指针(改成求具体两个数的数值即可
    • 三数之和(四数…)哈希法都不好解决,这里使用双指针法较好
      • 通过前后两个指针向中间逼近,一个for循环完成两个for的工作
      • 定一*k 移二法

你可能感兴趣的:(数据结构,算法)