You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:27:42