【面試刷題-力扣經典】409最長迴文串、647迴文子串、5最長迴文子串

409. 最長迴文串

【題目】

給定一個包含大寫字母和小寫字母的字符串,找到通過這些字母構造成的最長的迴文串。

在構造過程中,請注意區分大小寫。比如 “Aa” 不能當做一個迴文字符串。

【示例】

輸入:
“abccccdd”

輸出:
7

解釋:
我們可以構造的最長的迴文串是"dccaccd", 它的長度是 7。

【代碼】

package LeetCode;

import java.util.*;

public class LeetCode409 {
    public int longestPalindrome(String s) {
        Map<Character,Integer> map = new HashMap<>();

        int i,count,size;


        // 獲得每個字符的個數
        for (i=0; i<s.length(); i++) {
            count = 0;
            if (map.containsKey(s.charAt(i))) {
                count = map.get(s.charAt(i));
            }
            map.put(s.charAt(i),++count);
        }

        Iterator it = map.entrySet().iterator();

        // 記錄出現次數爲奇數的次數
        size = 0;
        while (it.hasNext()) {
            Map.Entry<Character,Integer> entry = (Map.Entry<Character, Integer>) it.next();
            if (entry.getValue()%2!=0) {
                size++;
            }
        }

        if (size==0) return s.length();
        else return s.length()-size+1;
    }

    public static void main(String[] args) {
        System.out.println(new LeetCode409().longestPalindrome("abccccdd"));
    }
}


647. 迴文子串

【題目】

給定一個字符串,你的任務是計算這個字符串中有多少個迴文子串。

具有不同開始位置或結束位置的子串,即使是由相同的字符組成,也會被計爲是不同的子串。

【示例】

輸入: “abc”
輸出: 3
解釋: 三個迴文子串: “a”, “b”, “c”.

【代碼】

class Solution {
    /**
    * 考慮使用動態規劃
    * dp[x][y] 代表的是從x到y是迴文子串
    * dp[x][y] = dp[x+1][y-1]是迴文子串,並且a[x]==a[y]
    * 邊界:把迴文1串和迴文2串找到
    * 這次的遍歷是迴文串的長度
    **/
    public int countSubstrings(String s) {

        if ("".equals(s) || s==null) return 0;

        int count,i,j,k;
        boolean[][] dp = new boolean[s.length()][s.length()];

        dp[0][0] = true;
        count = 1;
        for (i=1; i<s.length(); i++) {
            dp[i][i] = true;
            count++;
            if (s.charAt(i-1)==s.charAt(i)) {
                dp[i-1][i]=true;
                count++;
            }
        }

        // i代表的是迴文串的長度
        for (i=3; i<=s.length(); i++) {
            for (j=0; (j+i-1)<s.length(); j++) {
                k = j+i-1;
                if (dp[j+1][k-1] && s.charAt(j)==s.charAt(k)) {
                    dp[j][k] = true;
                    count++;
                }
            }
        }

        return count;

    }
}

5. 最長迴文子串

【題目】

給定一個字符串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度爲 1000。

【示例】

輸入: “babad”
輸出: “bab”
注意: “aba” 也是一個有效答案。

【思考】

這道題目在上一道題目的基礎上求解即可,都是尋找所有的迴文子串,一個是求最長,一個是所有的個數。

【代碼】

class Solution {
    public String longestPalindrome(String s) {
        if (s==null || s.length()==0) return "";

        int i,j,len,l,r,res,k;
        len = s.length();
        boolean[][] dp = new boolean[len][len];

        // 初始化邊界
        dp[0][0] = true;
        l = r = 0;
        res = 1;
        for (i=1; i<len; i++) {
            dp[i][i] = true;
            if (s.charAt(i-1) == s.charAt(i)) {
                dp[i-1][i] = true;
                res = 2;
                l = i-1;
                r = i;
            }
        }

        for (i=3; i<=len; i++) {
            for (j=0; (j+i-1)<len; j++) {
                k = j+i-1;
                if (dp[j+1][k-1] && s.charAt(j)==s.charAt(k)) {
                    dp[j][k] = true;
                    if (res < (k-j+1)) {
                        res = k-j+1;
                        l = j;
                        r = k;
                    }
                }

            }
        }
        return s.substring(l,r+1);
    }
}

【Java 面試那點事】

這裏致力於分享 Java 面試路上的各種知識,無論是技術還是經驗,你需要的這裏都有!

這裏可以讓你【快速瞭解 Java 相關知識】,並且【短時間在面試方面有跨越式提升】

面試路上,你不孤單!
在這裏插入圖片描述

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