680.验证回文字符串2

題目描述:

给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。

示例 1:

输入: "aba"
输出: True
示例 2:

输入: "abca"
输出: True
解释: 你可以删除c字符。

解题思路:双指针,不相等分情况进行遍历

代码:

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;
}

但是提交之后,发现运行时间比较长,21 ms,
然后我看了看用时最短的代码,发现他使用的方法差不多也是这种,唯一不同的是找指定位置字符串的时候是先将String转换为char数组,对char数组进行遍历

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;
}

但是,我觉得两者本质是没有任何区别的,String字符串内部实际就是一个char数组,charAt()方法和将String字符串转换为数组再获取值没有区别,为什么会出现执行时间差怎么多的情况呢?

private final char value[];
public char charAt(int index) {
    if ((index < 0) || (index >= value.length)) {
        throw new StringIndexOutOfBoundsException(index);
    }
    return value[index];
}

于是,我将两个的程序的运行时间进行打印,发现运行时间,两者基本相同......
然后 ,,,就没有然后了,,,,我也不知道什么原因了,,,,
如果有知道的大神,欢迎解答。

你可能感兴趣的:(680.验证回文字符串2)