您的位置:首页 > 其它

每日打卡:验证回文串

2020-07-18 04:22 148 查看

打卡: 从先序遍历还原二叉树

心情

你觉得你的心中还有爱么?
有,爱国家爱人民。
那你能为此做到什么?
我什么都做不到。
终究还是没有爱……

读题

leetcode: 125. 验证回文串

描述:
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。本题中,我们将空字符串定义为有效的回文串。

测试用例:
输入: “A man, a plan, a canal: Panama”
输出: true
输入: “race a car”
输出: false

看起来挺简单嘛,双指针循环就能处理

思路

1:循环字符串,第一个和最后一个比较

实现

public boolean isPalindrome(String s) {
if (s == null) {
return false;
}
//只考虑数字和字母,忽略大小写
int i = 0, j = s.length() - 1;
char[] chars = s.toCharArray();
while (i < j) {
//i从前往后
while (!isNumOrChar(chars[i]) && i < j) {
i++;
}
//j从后往前
while (!isNumOrChar(chars[j]) && j > i) {
j--;
}
if (chars[i] == chars[j] ||
(chars[i] >= 'A' && chars[j] >= 'A' && ((chars[i] + 32) == chars[j] || (chars[j] + 32) == chars[i]))) {
i++;
j--;
continue;
}else{
return false;
}
}
return true;
}

//判断char是不是数字字符或者字母
public boolean isNumOrChar(char c) {
return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z');
}

简单明了,就是判断是不是数字字母有点傻。

提交


执行用时倒是意料之中,内存消耗就有点离谱了。
改进一下,依然无法提升内存消耗的排名,反而执行时间多了:

public boolean isPalindrome(String s) {
if (s == null) {
return false;
}
//只考虑数字和字母,忽略大小写
int i = 0, j = s.length() - 1;
while (i < j) {
//i从前往后
while (!Character.isLetterOrDigit(s.charAt(i)) && i < j) {
i++;
}
//j从后往前
while (!Character.isLetterOrDigit(s.charAt(j)) && j > i) {
j--;
}
if (Character.toLowerCase(s.charAt(i)) == Character.toLowerCase(s.charAt(j))) {
i++;
j--;
continue;
}else{
return false;
}
}
return true;
}

有意思的解法

public boolean isPalindrome(String s) {
//大写转小写,去掉其他字符
s = s.toLowerCase().replaceAll("[^0-9a-z]", "");
//翻转字符串
String t = new StringBuffer(s).reverse().toString();
//比较字符串在常量池中的值
return s.intern() == t.intern();
}

参考官方题解加上其他用户的解答,我将这种解法给精简了一下,3行就解决了。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: