String --- 回文

思路:

1. 回文: 将当前string反转,其反转后的值和原先的值相等

2. 这个题中string若为空,则也为正确的回文。也可能包括符号,大小写字母,和数字,其中大小写忽略

3. 先对string做处理,将其全变成小写/大写。 然后比较string中每个字符是不是相同

4. 起点字符为string的第一个字母,终点字符为string中的最后一个字母

5. 起点应小于或等于终点

6. 若起点字符等于终点字符,则起点向右移,终点向左移。继续向中间比较

7. 若不相等,则不是一个合法的回文,返回false;

public boolean isPalindrome(String s) {

        //若string为空,或长度为1,则为合理回文

        if(s.length() <= 1){

            return true;

        }

        //设置起点终点

        int left = 0;

        int right = s.length() - 1;

        //将string做处理,其中字符全变成小写

        String temp = s.toLowerCase();

        //遍历string中的内容

        while(left <= right){

            //起点和终点字符

            char l = temp.charAt(left);

            char r = temp.charAt(right);

            //若起点字符是符号的话

            if(!Character.isLetterOrDigit(l)){

                //则起点右移

                left ++;

            }else if(!Character.isLetterOrDigit(r)){

                //若终点为符号,则终点向左移

                right --;

            }else{ 

                //若起点和终点字符不相等

            if(l != r){

                //则不是合法回文

                return false;

            }

                //若相等,则继续向内比较

            left++;

            right --;

        }

        }

        return true;

    }


思路

1. 这道题是要找出最长回文子序列

2. 依次判断string中的字符串,是不是回文

3. 有两种情况,一种为string中独立一个元素就为回文,第二种为string中的两个元素为回文

public String longestPalindrome(String s) {

    if (s == null || s.length() < 1) return "";

    int start = 0, end = 0;

    for (int i = 0; i < s.length(); i++) {

        //第一中情况,判断单个字符

        int len1 = expandAroundCenter(s, i, i);

        //第二种情况,从两个字符开始判单

        int len2 = expandAroundCenter(s, i, i + 1);

        //记录最长的子序列

        int len = Math.max(len1, len2);

        //若长度大于当前的遍历长度

        if (len > end - start) {

            //更新起点终点重新遍历

            start = i - (len - 1) / 2;

            end = i + len / 2;

        }

    }

        //返回起点到终点的字符串,即为最长子序列

    return s.substring(start, end + 1);

}

    //从中间判断是不是回文

private int expandAroundCenter(String s, int left, int right) {

    int L = left, R = right;

    //若为回文,及继续向两边扩展

    while (L >= 0 && R < s.length() && s.charAt(L) == s.charAt(R)) {

        L--;

        R++;

    }

    //返回找到的回文长度。

    return R - L - 1;

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容