最长对称子串java
时间: 2023-11-13 07:54:52 浏览: 93
可以使用动态规划来解决最长对称子串问题。具体做法是,定义一个二维数组dp,其中dp[i][j]表示从i到j的子串是否为回文串。初始化时,所有长度为1的子串都是回文串,即dp[i][i]=true。然后,从长度为2的子串开始,依次枚举所有长度大于等于3的子串,判断是否为回文串。如果是,则更新最长对称子串的长度和起始位置。
以下是Java代码实现:
```
public static String longestPalindrome(String s) {
int n = s.length();
boolean
相关问题
java校招面试题算法
Java校招面试题中常见的算法题有很多,以下是一些常见的题目类型:
1. 排序算法:如冒泡排序、快速排序、归并排序等。
2. 查找算法:如二分查找、哈希表、二叉搜索树等。
3. 字符串操作:如字符串反转、字符串匹配、最长公共子串等。
4. 动态规划:如背包问题、最长递增子序列、最小路径和等。
5. 图论算法:如广度优先搜索(BFS)、深度优先搜索(DFS)、最短路径算法等。
6. 树和二叉树:如二叉树的遍历、求二叉树的深度、判断二叉树是否对称等。
7. 链表:如链表的反转、链表的合并、链表的环检测等。
8. 栈和队列:如用栈实现队列、用队列实现栈、有效的括号等。
9. 动态规划:如背包问题、最长递增子序列、最小路径和等。
以上只是一些常见的算法题目类型,实际面试中可能会遇到更多不同类型的题目。在准备面试时,建议多做练习,熟悉常见的算法思想和解题方法。
马拉车算法java实现
马拉车算法是一种常用于字符串匹配的算法,其核心思想是利用回文串的对称性来减少比较次数。Java中可以通过以下步骤实现马拉车算法:
1. 预处理字符串,将字符串中的每个字符用一个特殊字符隔开,如:将字符串"abc"变成"#a#b#c#"
2. 维护一个数组P,其中P[i]表示以i为中心的最长回文子串的半径长度。具体实现时,可以使用一个中心点center和右边界right来维护,其中center表示当前已知的最长回文子串的中心点,right表示该回文子串的右边界。根据回文串的对称性,可以利用已知回文串的左侧字符的对称点来推出右侧字符的回文半径。
3. 遍历字符串,根据P数组更新center和right,并记录最长回文子串的起始位置和长度。
以下是Java代码实现示例:
```java
public class ManacherAlgorithm {
public static String longestPalindrome(String s) {
if (s == null || s.length() == 0) {
return "";
}
StringBuilder sb = new StringBuilder();
sb.append("#");
for (int i = 0; i < s.length(); i++) {
sb.append(s.charAt(i));
sb.append("#");
}
String str = sb.toString();
int[] P = new int[str.length()];
int center = 0, right = 0;
int start = 0, maxLen = 0;
for (int i = 0; i < str.length(); i++) {
if (i < right) {
P[i] = Math.min(right - i, P[2 * center - i]);
}
while (i - P[i] - 1 >= 0 && i + P[i] + 1 < str.length()
&& str.charAt(i - P[i] - 1) == str.charAt(i + P[i] + 1)) {
P[i]++;
}
if (i + P[i] > right) {
center = i;
right = i + P[i];
}
if (P[i] > maxLen) {
start = (i - P[i]) / 2;
maxLen = P[i];
}
}
return s.substring(start, start + maxLen);
}
public static void main(String[] args) {
String s = "babad";
System.out.println(longestPalindrome(s));
}
}
```
阅读全文