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 相關知識】,並且【短時間在面試方面有跨越式提升】
面試路上,你不孤單!