题目描述
关于我投机取巧失败那些事
单纯想利用stringbuilder的方法,所以就想一一删除每个字符然后调用reverse方法,结果就死在了这个删除字符这条路上,利用什么子串还有什么转字符数组然后要删除的地方换成空格,再转成字符串,还有每一次删除都创建一个stringbuilder,然后调他的删除方法生成一个新的stringbuilder,很遗憾都超出时间限制了,总之api的方法以后要慎用了!!!
想到String的replace方法,问了昌神发现replace会把所有的字符都换成另外一个字符,不能换某一索引的,底层还没记牢!!!
展示一个错误
class Solution {
public boolean validPalindrome(String s) {
StringBuilder str=new StringBuilder(s);
if(str.toString().equals(str.reverse().toString())){//StringBuilder类自带的方法
return true;
}else{
for(int i=0;i<s.length();i++){
//将字符串中的每一个位置上的元素都替换成空字符串
String str1=s.substring(0,i)+s.substring(i+1);
//得到一个新字符串,重复第一次不删除的操作
StringBuilder str2=new StringBuilder(str1);
if(str2.toString().equals(str2.reverse().toString())){
return true;
}
}
return false;
}
}
}
題解
class Solution {
public boolean validPalindrome(String s) {
int left=0, right=s.length()-1;
// 删除某个元素
while(left<right){
//出现不等的情况
if(s.charAt(left)!=s.charAt(right)){
return valid(s, left+1, right) || valid(s, left, right-1);
//要么删除左边,要么删除右边
}
left++;
right--;
}
return true;
}
//判断删除后是否回文
public boolean valid(String s, int left, int right){
while(left<right){
if(s.charAt(left)!=s.charAt(right)){
return false;
}
left++;
right--;
}
return true;
}
}