LeetCode热题100-day02

53 阅读1分钟

最长回文子串

  • 运用动态规划的思路求解。如果一个子串是回文串,那么去掉它的首尾字符,它还是一个回文串,由此我们得到状态回归方程:F(i,j) = F(i+1,j-1)^(s(i)==s(j)),边界条件为:子串的长度小于3,或者s(i)!=s(j)。
class Solution {
    public String longestPalindrome(String s) {
        int len = s.length();
        if(len == 1){
            return s;
        }

        char []ch = s.toCharArray();
        boolean [][]S = new boolean[len][len];
        int sum = 1;
        int start = 0;
        for(int i = 0; i < len; i++){
            S[i][i] = true;
        }

        for(int L = 2; L <= len; L++){
            for(int i = 0; i < len; i++){
                int j = L + i - 1;
                if(j >= len){
                    break;
                }
                if(ch[i] == ch[j]){
                    if(j - i < 3){
                        S[i][j] = true;
                    }else{
                        S[i][j] = S[i+1][j-1];
                    }
                    if(S[i][j] && j - i + 1 > sum){
                        sum = j - i + 1;
                        start = i;
                    }
                }else{
                    S[i][j] = false;
                }
            }
        }
        return s.substring(start, start + sum);
    }
}

Z 字形变换

  • 字符串拼接,熟练使用StringBuilder
class Solution {
    public String convert(String s, int numRows) {
        if(numRows < 2) return s;
        List<StringBuilder> rows = new ArrayList<StringBuilder>();
        for(int i = 0; i < numRows; i++) rows.add(new StringBuilder());
        int i = 0, flag = -1;
        for(char c : s.toCharArray()) {
            rows.get(i).append(c);
            if(i == 0 || i == numRows -1) flag = - flag;
            i += flag;
        }
        StringBuilder res = new StringBuilder();
        for(StringBuilder row : rows) res.append(row);
        return res.toString();
    }
}

整数反转

  • 即大数取模问题,采用取模运算取个位数,然后除10,重复直到变成0为止,本题由于题目对整数的大小要求是32位,则每次取完后判断一次是否大于214748364或小于-214748364即可
class Solution {
    public int reverse(int x) {
        int res = 0;
        while(x!=0) {     
            int tmp = x%10;
            if (res>214748364 || (res==214748364 && tmp>7)) {
                return 0;
            }
            if (res<-214748364 || (res==-214748364 && tmp<-8)) {
                return 0;
            }
            res = res*10 + tmp;
            x /= 10;
        }
        return res;
    }
}