【题解】LeetCode-最长回文子串(longest-palindromic-substring)、Z 字形变换(zigzag-conversion)、整数反转(reverse-integer)

最近换工作有点忙,刷题也不积极了~

5. 最长回文子串
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例 2:

输入: “cbbd”
输出: “bb”

思路
根据要求有两个点:

  1. 长度最长
  2. 回文串
    所以不妨假设存在这一的一个子串,逆序枚举长度,一旦其是回文,立马返回即可。
    分析一下时间复杂度,极限情况为: 500500250 = 62500000 < 10^8,所以可尝试一下。

解法

class Solution {
    public String longestPalindrome(String s) {
        String sub;
        // 枚举长度
        for (int i = s.length(); i > 0; i--) {
            // 顺序取子串
            for (int j = 0; j + i <= s.length(); j++) {
                // 判断合法与否
                if(isPanlindrome( sub = s.substring(j, j+i))){
                    return sub;
                }
            }
        }
        return "";
    }

    private boolean isPanlindrome(String s){
        int i=0, j= s.length()-1;
        while(i<j){
            if(s.charAt(i++)!=s.charAt(j--)){
                return false;
            }
        }
        return true;
    }
}

6. Z 字形变换
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。

比如输入字符串为 “LEETCODEISHIRING” 行数为 3 时,排列如下:

L C I R
E T O E S I I G
E D H N
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“LCIRETOESIIGEDHN”。

请你实现这个将字符串进行指定行数变换的函数:

string convert(string s, int numRows);
示例 1:

输入: s = “LEETCODEISHIRING”, numRows = 3
输出: “LCIRETOESIIGEDHN”
示例 2:

输入: s = “LEETCODEISHIRING”, numRows = 4
输出: “LDREOEIIECIHNTSG”
解释:

L D R
E O E I I
E C I H N
T S G

思路
通过画图标记处下标,很快就可以找到规律,无需详说。

解法

class Solution {
    public String convert(String s, int numRows) {
        if (null == s || s.length() == 0) {
            return "";
        }
        int n = 2 * numRows - 2;
        if (n <= 0) {
            return s;
        }
        return build(s, n, numRows);
    }

    private String build(String s, int n, int r) {
        int i = 0, split;
        boolean odd;
        StringBuilder builder = new StringBuilder();
        while (i < r) {
            split = isFirstOrLast(i,r) ? n : n - (r - i - 1) * 2;
            odd = true;
            for (int j = i; j < s.length(); j += odd||isFirstOrLast(i,r) ? split : n - split) {
                builder.append(s.charAt(j));
                odd = !odd;
            }
            ++i;
        }
        return builder.toString();
    }

    private boolean isFirstOrLast(int i, int r){
        return (i == 0 || i == r - 1);
    }
}

7. 整数反转
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

示例 1:

输入: 123
输出: 321
示例 2:

输入: -123
输出: -321
示例 3:

输入: 120
输出: 21

思路
简单的字符流。注意极限情况整形溢出就好。

解法

class Solution {
    public int reverse(int x) {
        long n = Math.abs((long) Math.abs(x));
        boolean isPos = x >= 0;

        String buf = Long.toString(n);
        StringBuilder builder = new StringBuilder();
        for (int i = buf.length() - 1; i >= 0; --i) {
            builder.append(buf.charAt(i));
        }
        Long rn = new Long(builder.toString());
        if (rn > Integer.MAX_VALUE || rn < Integer.MIN_VALUE) {
            return 0;
        }
        if (isPos) {
            return rn.intValue();
        }
        return -rn.intValue();
    }
}

以上。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章