LeetCode150道面试经典题--验证回文串(简单)

1.题目

如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串

字母和数字都属于字母数字字符。

给你一个字符串 s,如果它是 回文串 ,返回 true ;否则,返回 false

2.示例

LeetCode150道面试经典题--验证回文串(简单)_第1张图片


3.思路

双指针:

先将字符串通过String的LowerCase方法让字符串所有字符变为小写字符,再通过设置头尾两个指针放置于字符串的头尾,在遍历字符串时候,头尾指针先进行遍历找到合法字符(通过方法Character.isLetterOrDigit方法就能识别该字符是否合法)进行比较。举例来说比如一个字符串

“a ) s a (” 那么头尾指针第一个找到的就是a进行比较,如果相等则头尾指针往中心靠拢一格,直到指针相等或者头指针小于尾部指针

4.代码

LeetCode代码:

class Solution {
    public boolean isPalindrome(String s) {
      String str = s.toLowerCase();
        int pre = 0;
        int Des = str.length() - 1;
        while (pre < Des) {
            while (pre < Des && !Character.isLetterOrDigit(str.charAt(pre))) {
                pre++;
            }
            while (pre < Des && !Character.isLetterOrDigit(str.charAt(Des))) {
                Des--;
            }
            if (str.charAt(pre) != str.charAt(Des)) {
                return false;
            }
            pre++;
            Des--;
        }
        return true;
    }
}

LeetCode150道面试经典题--验证回文串(简单)_第2张图片

总结:时间复杂度为O(n) 空间复杂度为 O(1)

详细案例代码:

package LeetCode1001;

public class javaDemo {
    public static void main(String[] args) {
        String s = "A man, a plan, a canal: Panama";
//        返回值
        boolean flag = true;
//        将字符串转为小数
       String str = s.toLowerCase();
//        设置头尾指针
        int pre=0; int des=str.length()-1;
        while (pre<=des){
//            在找到相应的合法字符前一直靠拢
            while (prepre && !Character.isLetterOrDigit(des)){
                des--;
            }
//            当两个指针都各就位时候则开始比较,如果字符不匹配则直接返回flase
            if (str.charAt(pre)!=str.charAt(des)){
                flag = false;
                break;
            }
//            如果两个有效位都一样则继续往中间靠拢
            pre++;des--;
        }
//        输出返回值
        System.out.println(flag);
    }
}

你可能感兴趣的:(leetcode,leetcode,面试,职场和发展,java)