【題解】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();
    }
}

以上。

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