如何在String中查找并返回其中包含的回文子串?
从字符串中提取连续回文子串的实现方案
嘿,从你给出的例子来看,你需要找的是原字符串中连续字符组成的回文子串,而且返回的是其中最长的那个(UHU、ANNA都是输入里最长的连续回文)。下面我会用中心扩展法来实现这个需求——这是处理连续回文问题最经典高效的思路,因为回文天然具有对称性,我们可以围绕每个可能的中心向两边扩展,找出所有符合条件的回文,再根据需求返回结果。
Python 实现代码
def extract_palindrome(s): found_palindromes = set() # 用集合避免重复的短回文 str_len = len(s) # 处理奇数长度的回文(中心是单个字符) for i in range(str_len): left, right = i, i while left >= 0 and right < str_len and s[left] == s[right]: current_pal = s[left:right+1] # 过滤掉单个字符的回文(毕竟你例子里没返回这类) if len(current_pal) > 1: found_palindromes.add(current_pal) left -= 1 right += 1 # 处理偶数长度的回文(中心是两个相邻字符) for i in range(str_len - 1): left, right = i, i + 1 while left >= 0 and right < str_len and s[left] == s[right]: current_pal = s[left:right+1] found_palindromes.add(current_pal) left -= 1 right += 1 # 如果没有找到符合条件的回文,返回None;否则返回最长的那个 if not found_palindromes: return None return max(found_palindromes, key=lambda x: len(x)) # 测试你的示例输入 print(extract_palindrome("hsjwiUHUkajs")) # 输出: UHU print(extract_palindrome("hjakhdANNAjhad")) # 输出: ANNA
Java 实现代码
import java.util.HashSet; import java.util.Set; public class PalindromeFinder { public static String getLongestPalindrome(String inputStr) { if (inputStr == null || inputStr.length() < 2) { return null; // 不存在长度大于1的回文 } Set<String> palindromeSet = new HashSet<>(); int strLength = inputStr.length(); // 处理奇数长度回文 for (int i = 0; i < strLength; i++) { expandFromCenter(inputStr, i, i, palindromeSet); } // 处理偶数长度回文 for (int i = 0; i < strLength - 1; i++) { expandFromCenter(inputStr, i, i + 1, palindromeSet); } if (palindromeSet.isEmpty()) { return null; } // 筛选出最长的回文 String longestPalindrome = ""; for (String pal : palindromeSet) { if (pal.length() > longestPalindrome.length()) { longestPalindrome = pal; } } return longestPalindrome; } private static void expandFromCenter(String s, int left, int right, Set<String> palSet) { while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) { String currentPal = s.substring(left, right + 1); if (currentPal.length() > 1) { palSet.add(currentPal); } left--; right++; } } public static void main(String[] args) { System.out.println(getLongestPalindrome("hsjwiUHUkajs")); // 输出 UHU System.out.println(getLongestPalindrome("hjakhdANNAjhad")); // 输出 ANNA } }
额外说明
- 去重处理:用集合存储找到的回文,是因为同一个短回文可能被多次检测到(比如长回文里包含短的),集合可以自动去重。
- 大小写敏感:代码默认是大小写敏感的,和你的例子一致。如果需要忽略大小写,只需要在比较字符的时候统一转成大写或小写即可(比如Python里改成
s[left].upper() == s[right].upper())。 - 返回所有回文:如果你不需要最长的,而是要返回所有长度大于1的回文,只需要把集合转成列表返回就行,去掉找最长的那段逻辑。
内容的提问来源于stack exchange,提问作者hamudi97
相关产品推荐
相关产品推荐

