最长回文子串
November 22, 2024About 2 min
最长回文子串
subsequence 子序列(非连续字符):O(2^n)
substring 子串(非连续字符):O(n^2)
回文子串
暴力
for 起点 O(n)
for 终点 O(n)
判断是否回文 O(n)
优化:枚举长度、枚举起点,判断回文
异常检测
每一逻辑块间用空行分割
双指针
- 相向双指针
- 同向
- 背向
逻辑能力、coding能力,不是考背诵,所以不要写这个manacher这样的算法(而且他也不会)
缩进一般不要超过三层、超过的时候,尽量想办法封装函数出去
优化的逻辑:
- 先想暴力的方法
- 看哪里有地方是浪费的
优秀的Coding Quality
bug free
有边界检测和异常处理
代码风格:命名规范、空格、空行
每一个逻辑Part之间一个空格划分
如异常判断、主体逻辑、结果返回,这些part之间一个分行
变量命名采用全称:1-2个单词,小驼峰
避免重复代码,不允许(泄露没有工程经验)
用不到的变量用_来命名
尽可能避免全局变量
缩进:java是4个
空格
- 运算符前后要有
- 逗号、分号后面有
写Python能大概减少10分钟的时间,如果是面试不限制语言的话,可以写Python
中心点枚举法
N2
他说尽量不要用全局变量,大家偷偷摸摸的改容易出现问题,一般要放在参数列表里,或者放到返回值里
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++) {
}
}
评价体系:
独孤九剑 - 总决式
想做到bug free最重要的是优化code Quality
单元运算符:--, ++, !
多用continue少用if:减少大段代码的缩进
也可以尽量减少else,如果前面的if里面执行了return或者continue、break等,后面就不需要else if,直接普通的if,最后不需要else,直接普通的xxx
最好把嵌套式的改成并列的:好懂得多
typo
主要的异常检测:
传入参数是null
string 是否是 ""
访问数组下标前确保下标不越界
while (i < a.length && a[i] == ...) { }
访问对象时,确保对象不是null:尤其是链表的题
while (node != null && node.val > 0) { }