【LeetCode#125】三种解法

  • Post author:
  • Post category:其他




LeetCode#125



思路

回文串最常见3种解法:双指针、栈、字符串反转



双指针

  • PS:面试中不建议用正则,因为考察不出你的水平,面试官肯定还会问别的方法实现过滤
    public static boolean isPalindrome2(String s) {

// 过滤非字母数字字符, \\W ==>  [^a-zA-Z0-9],面试时用正则可能还会问另一种方法
        String str = s.replaceAll("\\W", "");
        // 双指针
        int start = 0, end = str.length() - 1;
        while (start < end) {
            if (Character.toUpperCase(str.charAt(start)) != Character.toUpperCase(str.charAt(end))) return false;
            start++;
            end--;
        }
        return true;
}




  • 将字符串前一半放入栈中,遍历后半段并且跟栈顶元素比较,相同则pop弹出,否则直接返回false
public static boolean isPalindrome2(String s) {
	Stack stack = new Stack();
    // 去除非字母非数字
    StringBuffer stringBuffer = new StringBuffer();
    for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);
        if (Character.isLetterOrDigit(c)) {
            stringBuffer.append(Character.toLowerCase(c));
        }
    }
    // 将前一半字符串入栈
    int l = stringBuffer.length();
    for (int i = 0; i < l / 2; i++) {
        stack.push(stringBuffer.charAt(i));
    }
    // 栈里元素与后部分字符串比较
    int start = l % 2 == 1 ? l / 2 + 1 : l / 2; // 取中间数往后开始遍历
    for (int i = start; i < l; i++) {
        if ((char)stack.peek() == stringBuffer.charAt(i)){
            stack.pop();
        }else return false;
    }

    return true;
}
}



字符串反转

  • 不是很建议刷算法题直接调用现成的方法,可自己实现一下
public static boolean isPalindrome2(String s) {
StringBuffer stringBuffer = new StringBuffer();
        // 去除非字母非数字
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (Character.isLetterOrDigit(c)) {
                stringBuffer.append(Character.toLowerCase(c));
            }
        }
        // 反转比较字符串
        StringBuffer stringBufferRev = new StringBuffer(stringBuffer).reverse();
        return stringBuffer.toString().equals(stringBufferRev.toString());
}



版权声明:本文为qq_32106647原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。