125. Valid Palindrome判断有效的有符号的回文串
[抄题]:
Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.
For example,"A man, a plan, a canal: Panama"
is a palindrome."race a car"
is not a palindrome.
[暴力解法]:
时间分析:
空间分析:
[优化后]:
时间分析:
空间分析:
[奇葩输出条件]:
用cHead cTail 存头尾字母,不用每次都临时转换
[奇葩corner case]:
- 空字符串是具体的实例对象,所以用isempty()而不是null
- 此题中大小写不敏感,所以需要都转换为小写
[思维问题]:
不知道符号怎么处理:Character.isLetterOrDigit
[一句话思路]:
[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):
[画图]:
[一刷]:
- 此题特殊:while里面嵌套if else if,一次只操作一位,防止指针没到位就判断对称了.chead ctail属于因变量,都要在循环体内随即变化,下次注意
- 一对字母不管是否对称,都要继续head++ tail-- 促进下一步继续进行,要理解到位
[二刷]:
-
应该是互斥else if关系。因为如果已经到边界了,就不用继续进行下去了。
- 最好是用isLetterOrDigit()这个函数。不要用小于a大于z这样的,有的case过不去
[三刷]:
-
在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式。
一般的算法题都没有对象,而且静态方法是通用的,所以一般要写"类名.方法名"
而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象。
[四刷]:
[五刷]:
[五分钟肉眼debug的结果]:
[总结]:
while里面嵌套if else if,一次只操作一位,防止指针没到位就判断对称了.chead ctail属于因变量,都要在循环体内随即变化,下次注意
[复杂度]:Time complexity: O(n) Space complexity: O(1)
[英文数据结构或算法,为什么不用别的数据结构或算法]:
[关键模板化代码]:
[其他解法]:
[Follow Up]:
[LC给出的题目变变变]:
[代码风格] :
class Solution { public boolean isPalindrome(String s) { char[] chars = s.toCharArray(); int i = 0; int j = chars.length - 1; while (i < j) { if (!Character.isLetterOrDigit(chars[i])) { i++; }//1到边界了,其实还不是字母 else if (!Character.isLetterOrDigit(chars[j])) { j--; }//0 else{ if(Character.toLowerCase(chars[i]) != Character.toLowerCase(chars[j])) { System.out.println(Character.toLowerCase(chars[i])); System.out.println(Character.toLowerCase(chars[j])); return false; } i++; j--; } } return true; } }