java 回文子串,回文子串

字符串的回文串总结

一看到回文字符串,脑海里立马要想到前面两个最常用的结题思路: 1.动态规划

2.中心扩散法

3.还有著名的马拉车算法

leetcode出现的回文字符串的三个题: 1.回文子串的个数

2.最长回文子串

3.最长不连续的回文子串

1.回文子串的个数——本题 public class Solution14_回文子串 {

/**

* 方法一:中心扩散法

*/

static int ans = 0;

public static void main(String[] args) throws IOException {

BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));

String s = bf.readLine();

for (int i = 0; i < s.length(); i++) {

//考虑两种情况:aba 和 abba

centerSpread(s, i, i);

centerSpread(s, i, i + 1);

}

System.out.println(ans);

}

//判断回文串的中心扩散法

private static void centerSpread(String s, int left, int right) {

while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {

left--;

right++;

ans++;

}

}

//方法二:动态规划

private static int dp(String s) {

int n = s.length(), ans = 0;

boolean[][] dp = new boolean[n][n];

for (int i = n - 1; i >= 0; i--) {

for (int j = i; j < n; j++) {

dp[i][j] = (s.charAt(i) == s.charAt(j)) && (j - i <= 2 || dp[i + 1][j - 1]);

if (dp[i][j]) ans++;

}

}

return ans;

}

}

2.最长回文子串

Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.

Example 1:

Input: "babad"

Output: "bab"

Note: "aba" is also a valid answer.

Example 2:

Input: "cbbd"

Output: "bb" class Qusetion2 {

//1.动态规划

public static String longestPalindrome(String s) {

int n = s.length();

if (n < 2) return s;

int maxLen = 1;

String res = s.substring(0, 1);

boolean[][] dp = new boolean[n][n];

//左边界一定小于右边界,因此从右边界开始

for (int r = 1; r < n; r++) { //表示右边界

for (int l = 0; l < r; l++) { //表示左边界

// 区间应该慢慢放大

// 状态转移方程:如果头尾字符相等并且中间也是回文

// 在头尾字符相等的前提下,如果收缩以后不构成区间(最多只有 1 个元素),直接返回 True 即可

// 否则要继续看收缩以后的区间的回文性

if (s.charAt(l) == s.charAt(r) && ((r - l) <= 2 || dp[l + 1][r - 1])) {

dp[l][r] = true;

if (r - l + 1 > maxLen) {

maxLen = r - l + 1;

res = s.substring(l, r + 1);

}

}

}

}

return res;

}

//2.中心扩展法

private int start, maxLen;

public String longestPalindrome1(String s) {

if (s == null || s.length() < 2) return s;

for (int i = 0; i < s.length(); i++) {

//考虑中心扩散的两种情况1:aba 和 2: bb

findMaxPalindrome(s, i, i);

findMaxPalindrome(s, i, i + 1);

}

return s.substring(start, start + maxLen);

}

private void findMaxPalindrome(String s, int i, int j) {

while (i >= 0 && j < s.length() && s.charAt(i) == s.charAt(j)) {

i--;//向左延伸

j++;//向右延伸

}

//记录每个起始点扩展的回文串的最大长度

if (maxLen < j - i - 1) {

start = i + 1;

maxLen = j - i - 1;

}

}

}

3.最长不连续回文子串

Given a string s, find the longest palindromic subsequence's length in s. You may assume that the maximum length of s is 1000.

Example 1:

Input:

"bbbab"

Output:

4

One possible longest palindromic subsequence is "bbbb". public int longestPalindrome(String s) {

int n = s.length();

int[][] dp = new int[n][n];//dp[l][r]表示l-r中的最长回文串

for (int r = 0; r < n; r++) {

dp[r][r] = 1;

for (int l = r - 1; l >= 0; l--) {

if (s.charAt(l) == s.charAt(r)) {

dp[l][r] = dp[l + 1][r - 1] + 2;

} else {

dp[l][r] = Math.max(dp[l + 1][r], dp[l][r - 1]);

}

}

}

return dp[0][n - 1];

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值