目录

IsPalindrome

目录
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package efl.ryl.easy;
/**
 * Author: Azad-eng
 * Date: 2022/3/5
 * Description:
 * 判断字符串是否是回文串(正读反读一样的字符串,比如level,noon)
 */
public class IsPalindrome {
    public boolean method1(String srcString) {
        /**
         * 思路分析:
         * 方法1——筛选+判断
         * 1)遍历字符串srcString进行筛选(Character.isLetterOrDigit(srcString.charAt())),只保留字母字符和数字字符
         * 2)将筛选后的字符串的每一个字符都转换成小写(Character.toLowerCase())并放进另一个新的字符串中desString(new->append),
         * 3)判断desString是否为回文串:
         * -使用翻转字符串的方法reverse得到把desString倒序读的字符串revString(注意这里要生成一个新的倒置的字符串,不能直接改变desString)
         * -将revString与desString进行相等判断,如果相等返回true,表示是回文串,反之false
         */
        StringBuffer desString = new StringBuffer();
        for (int i = 0; i < srcString.length(); i++) {
            if (Character.isLetterOrDigit(srcString.charAt(i))) {
                desString.append(Character.toLowerCase(srcString.charAt(i)));
            }
        }
//        StringBuffer reverse = desString.reverse(); x
//        desString是StringBuffer类的,保存的是字符串变量,不同于String,里面的值是可以更改的。为了避免这种更改,所以要新建一个StringBuffer
        StringBuffer revString = new StringBuffer(desString).reverse();
//        return revString.equals(desString); x
//        这里的revString和desString是两个object,这里equals判断的是两个对象是否是同一个对象,而不是判断它们的值是否相等
        return (new String(revString)).equals(new String(desString));
    }

    public boolean method2(String srcString) {
        /**
         * 思路分析
         * 方法2——双指针
         * 1)引入两个index变量int left=0 , int right = srcString.length()-1
         * 2)+————————————————————+
         *   |  |  |  |  |  |  |  |
         *   +————————————————————+
         *     ^                 ^
         *     |                 |
         *   left             right
         * 3)让left向右移动,right向左移动,一直循环到left>right,如果期间遇到非数字或字母的字符就让left++,或right--,即跳过它们
         * 4)对全部转成成小写的字符做出相等判断,一旦有一组字符不等,就返回false,如果循环结束依然没有返回false,代表该字符串是回文串,那么返回true
         */
        int left = 0;
        int right = srcString.length() - 1;
        while (left <= right){
            if(Character.toLowerCase(srcString.charAt(left))!=Character.toLowerCase(srcString.charAt(right))){
                return false;
            }
            left++;
            right--;
            if (!Character.isLetterOrDigit(srcString.charAt(left))){
                left++;
            }
            if (!Character.isLetterOrDigit(srcString.charAt(right))){
                right--;
            }
        }
        return true;
    }

    public static void main(String[] args) {
        System.out.println(new IsPalindrome().method2("l,ev e l"));
    }
}