題目描述:
給定一個非空字符串 s,最多刪除一個字符升筏。判斷是否能成為回文字符串撑柔。
示例 1:
輸入: "aba"
輸出: True
示例 2:輸入: "abca"
輸出: True
解釋: 你可以刪除c字符。
解題思路:雙指針您访,不相等分情況進(jìn)行遍歷
代碼:
public boolean validPalindrome(String s) {
int i = 0, j = s.length() - 1;
while(i < j) {
if(s.charAt(i) == s.charAt(j)){
i++;
j--;
} else{
return fun(s, i+ 1, j) | fun(s, i, j-1) ;
}
}
return true;
}
private boolean fun(String s, int i, int j) {
while(i < j) {
if(s.charAt(i) == s.charAt(j)){
i++;
j--;
} else {
return false;
}
}
return true;
}
但是提交之后铅忿,發(fā)現(xiàn)運(yùn)行時間比較長,21 ms灵汪,
然后我看了看用時最短的代碼辆沦,發(fā)現(xiàn)他使用的方法差不多也是這種,唯一不同的是找指定位置字符串的時候是先將String轉(zhuǎn)換為char數(shù)組识虚,對char數(shù)組進(jìn)行遍歷
char[] chars = s.toCharArray();
然后我將我的代碼中的charAt()方法都修改了一下,用時縮短到了9 ms妒茬。代碼如下:
public boolean validPalindrome(String s) {
char[] chars = s.toCharArray();
int i = 0, j = s.length() - 1;
while(i < j) {
if(chars[i] == chars[j]){
i++;
j--;
} else{
return fun(chars, i+ 1, j) | fun(chars, i, j-1) ;
}
}
return true;
}
private boolean fun(char[] chars, int i, int j) {
while(i < j) {
if(chars[i] == chars[j]){
i++;
j--;
} else {
return false;
}
}
return true;
}
但是担锤,我覺得兩者本質(zhì)是沒有任何區(qū)別的,String字符串內(nèi)部實際就是一個char數(shù)組乍钻,charAt()方法和將String字符串轉(zhuǎn)換為數(shù)組再獲取值沒有區(qū)別肛循,為什么會出現(xiàn)執(zhí)行時間差怎么多的情況呢?
private final char value[];
public char charAt(int index) {
if ((index < 0) || (index >= value.length)) {
throw new StringIndexOutOfBoundsException(index);
}
return value[index];
}
于是银择,我將兩個的程序的運(yùn)行時間進(jìn)行打印多糠,發(fā)現(xiàn)運(yùn)行時間,兩者基本相同......
然后 浩考,夹孔,,就沒有然后了,搭伤,只怎,怜俐,我也不知道什么原因了身堡,,拍鲤,贴谎,
如果有知道的大神,歡迎解答季稳。