题目
- 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
- 字母和数字都属于字母数字字符。
- 给你一个字符串
s
,如果它是 回文串 ,返回true
;否则,返回false
。 - 示例 1:
-
输入: s = "A man, a plan, a canal: Panama" 输出:true 解释:"amanaplanacanalpanama" 是回文串。
基本思路
- 用 String 类里面的 toLowerCase() 方法将字符串大写字母变小写
- 用 String 类里面的 toCharArray() 方法将字符串装换为字符数组
- 创建一个新字符数组 newChars[],将原字符数组 chars[] 的字母与数字放进去
- 用一个指针 j 定位最后一个写入的位置
- 设置 flag 标志,默认值为 false
- 设置 left,right 指针分别指向数组最前面的数据和最后面的数据(注意这里最后面的位置是指针 j 的前一个)
- while 循环数组,每次循环 left 右移,right 左移
- 当 left >=right 或者 left 指向的字符和 right 指向的字符不同时结束循环
- left 与 right 指向不同字符而退出循环的话,left 必定小于 right
- 判断 left>right 为真则 flag=true
代码如下
public static boolean isPalindrome(String s) {
// 字符串大写变小写
char[] chars = s.toLowerCase().toCharArray();
char[] newChars = new char[100000];
// 放到新数组
int j=0;
for (int i = 0; i < chars.length; i++) {
if ( (chars[i] >= 'A' && chars[i] <= 'Z') || (chars[i] >= 'a' && chars[i] <= 'z') || (chars[i] >= 48 && chars[i] <=57 )) {
newChars[j] = chars[i];
j++;
}
}
boolean flag = false;
int left=0, right=j-1;
while( left < right ) {
if ( newChars[left] == newChars[right] ) {
left ++;
right--;
}else {
break;
}
}
if ( left >= right) {
flag = true;
}
return flag;
}
时间复杂度度:O(n)