17370845950

如何根据用户指定长度从字符串中提取首个回文子串

本文介绍一种不使用数组的纯字符串操作方法,实现从用户输入的句子中提取指定长度的首个回文子串,并提供完整、健壮的 java 实现。

要实现“根据用户指定长度提取回文子串”,核心思路是:遍历原字符串所有可能的连续子串(长度等于用户输入值),逐个判断是否为回文,找到第一个即返回。注意,题目明确禁止使用数组(包括 char[]),因此我们全程采用 String 和 StringBuilder 进行操作——后者 .reverse() 方法是安全且高效的字符串翻转工具,不违反约束。

以下是推荐实现:

public String printPalindrome(String sentence, int size) {
    // 边界校验:负长度无意义,超长则截断为句子本身长度
    if (size < 0) return "";
    if (size > sentence.length()) size = sentence.length();

    // 遍历所有长度为 size 的连续子串(起始索引 i 从 0 到 sentence.length() - size)
    for (int i = 0; i + size <= sentence.length(); i++) {
        String miniStr = sentence.substring(i, i + size);
        String reverseStr = new StringBuilder(miniStr).reverse().toString();

        // 区分大小写敏感匹配(如题目示例中 "cec" 与原句无关,仅关注子串自身回文性)
        if (miniStr.equals(reverseStr)) {
            return miniStr;
        }
    }

    // 未找到符合条件的回文子串
    return "";
}

关键说明

  • 该方法不依赖任何数组,完全基于 String.substring() 和 StringBuilder.reverse();
  • 自动处理边界情况:size ≤ 0 返回空字符串,size > sentence.length() 时自动降级为全句长度;
  • 子串回文判断严格按字符顺序比对(区分大小写),若需忽略大小写,可改为 miniStr.equalsIgnoreCase(reverseStr);
  • 返回的是首个匹配的回文子串,符合题目“Here is your palindrome”语义;
  • 时间复杂度为 O(n × size),空间复杂度为 O(size),高效且易于理解。

⚠️ 注意:原始问题中提到的示例(输入 "racecar" 和 3 得到 "cec")存在逻辑偏差——"cec" 并非 "racecar" 的子串,而是误将中间对称字符拼接。本实现严格遵循子串连续性原则,确保结果真实存在于原字符串中,更符合工程实践要求。