Skip to main content

最长回文子串

David LiuAbout 3 min

最长回文子串

subsequence 子序列(非连续字符):O(2^n)

substring 子串(非连续字符):O(n^2)

回文子串

暴力

for 起点 O(n)

​ for 终点 O(n)

​ 判断是否回文 O(n)

优化:枚举长度、枚举起点,判断回文

截屏2022-07-08 10.53.11

异常检测

每一逻辑块间用空行分割

双指针

  • 相向双指针
  • 同向
  • 背向

逻辑能力、coding能力,不是考背诵,所以不要写这个manacher这样的算法(而且他也不会)

缩进一般不要超过三层、超过的时候,尽量想办法封装函数出去

优化的逻辑:

  1. 先想暴力的方法
  2. 看哪里有地方是浪费的

优秀的Coding Quality

  1. bug free

  2. 有边界检测和异常处理

  3. 代码风格:命名规范、空格、空行

    1. 每一个逻辑Part之间一个空格划分

      如异常判断、主体逻辑、结果返回,这些part之间一个分行

    2. 变量命名采用全称:1-2个单词,小驼峰

    3. 避免重复代码,不允许(泄露没有工程经验)

    4. 用不到的变量用_来命名

    5. 尽可能避免全局变量

    6. 缩进:java是4个

    7. 空格

      1. 运算符前后要有
      2. 逗号、分号后面有

写Python能大概减少10分钟的时间,如果是面试不限制语言的话,可以写Python

截屏2022-07-09 13.26.10

中心点枚举法

N2

image-20221128221308694

他说尽量不要用全局变量,大家偷偷摸摸的改容易出现问题,一般要放在参数列表里,或者放到返回值里

Follow up:不使用中心点枚举,怎么办?

可以使用DP(区间型动态规划)

状态转移方程,

初始化,

isPalindrome[i][j] = isPalindrome[i + 1][j - 1] && (
	s.charAt(i) == s.charAt(j)
)

for ()
    
for (int i = n - 1; i >= 0; i--) {
    for (int j = i; j < n; j++) {
        
    }
}

评价体系:

截屏2022-07-09 13.28.13

截屏2022-07-09 13.30.01

独孤九剑 - 总决式

想做到bug free最重要的是优化code Quality

截屏2022-07-09 13.37.10

单元运算符:--, ++, !

多用continue少用if:减少大段代码的缩进

也可以尽量减少else,如果前面的if里面执行了return或者continue、break等,后面就不需要else if,直接普通的if,最后不需要else,直接普通的xxx

最好把嵌套式的改成并列的:好懂得多

typo

主要的异常检测:

  1. 传入参数是null

  2. string 是否是 ""

  3. 访问数组下标前确保下标不越界

    while (i < a.length && a[i] == ...) {
        
    }
    
  4. 访问对象时,确保对象不是null:尤其是链表的题

    while (node != null && node.val > 0) {
        
    }