寻找最长对称子串的长度 | Baeldung
寻找最长对称子串的长度 | Baeldung
1. 引言
确定最长对称子串的长度是字符串操作任务中的一个常见挑战。
在本教程中,我们将讨论两种高效的Java方法来解决这个问题。
2. 理解对称子串
对称子串是一个正读和反读都相同的子串。例如,在字符串 "abba" 中,最长的对称子串是 "abba",它正读和反读都是相同的,最大长度为4。
3. 对称子串扩展方法
这种方法使用滑动窗口技术来高效地识别给定字符串中的最长对称子串。本质上,算法通过迭代字符串,从中间开始扩展,同时确保对称性。
让我们深入了解实现:
private int findLongestSymmetricSubstringUsingSymmetricApproach(String str) {
int maxLength = 1;
// 方法实现
}
在这个函数中,我们将 maxLength 初始化为 1,表示回文子串的默认长度。然后,我们将迭代输入字符串中的所有可能的子串,如下所示:
for (int i = 0; i `< str.length(); i++) {
for (int j = i; j < str.length(); j++) {
int flag = 1;
for (int k = 0; k < (j - i + 1) / 2; k++) {
if (str.charAt(i + k) != str.charAt(j - k)) {
flag = 0;
break;
}
}
if (flag != 0 && (j - i + 1) >` maxLength) {
maxLength = j - i + 1;
}
}
}
在每个子串中,我们使用嵌套循环从两端向中心比较字符,检查对称性。此外,如果发现子串是对称的(flag 不为 0)并且其长度超过 maxLength,我们将使用新的长度更新 maxLength。
最后,我们将返回在输入字符串中找到的最长对称子串的最大长度,如下所示:
return maxLength;
4. 使用暴力方法
暴力方法提供了一个直接的解决方案。以下是我们如何实现这种方法的示例:
private int findLongestSymmetricSubstringUsingBruteForce(String str) {
if (str == null || str.length() == 0) {
return 0;
}
int maxLength = 0;
for (int i = 0; i `< str.length(); i++) {
for (int j = i + 1; j <= str.length(); j++) {
String substring = str.substring(i, j);
if (isPalindrome(substring) && substring.length() >` maxLength) {
maxLength = substring.length();
}
}
}
return maxLength;
}
在这里,我们详尽地检查输入字符串中的所有可能的子串,以识别潜在的回文子串。此外,这个过程涉及迭代字符串的每个字符,将其视为子串的潜在起始点。
对于每个起始位置,该方法迭代后续字符以构建不同长度的子串。
一旦我们构建了一个子串,我们就将其传递给 isPalindrome() 方法,以确定它是否是回文,如下所示:
private boolean isPalindrome(String str) {
int left = 0;
int right = str.length() - 1;
while (left < right) {
if (s.charAt(left) != s.charAt(right)) {
return false;
}
left++;
right--;
}
return true;
}
这个方法通过从两端向中心比较字符,确保子串中的字符对称地镜像。如果子串通过回文测试并且其长度超过了当前的 maxLength,它就被视为最长回文子串的候选。在这种情况下,该方法更新 maxLength 变量以反映新的最大长度。
5. 结论
在本文中,我们讨论了如何处理对称子串扩展方法,强调了特定要求的重要性,例如输入大小和计算效率。
如常,本文的完整代码示例可以在 GitHub 上找到。
文章发布后30天内开放评论。对于此日期之后的任何问题,请使用网站上的联系表单。