
本文介绍一种不依赖数组的纯字符串操作方法,用于在用户输入的句子中查找指定长度的第一个回文子串,并返回该回文;若不存在则返回空字符串。
在实际开发中,我们常需从一段文本中提取满足特定条件的子串,例如:给定一个字符串和目标长度 size,找出其中首个长度恰好为 size 的回文子串。注意,题目明确要求不使用数组(即避免 char[] 显式拆分),因此应优先利用 Java 内置的字符串方法(如 substring()、StringBuilder.reverse())完成逻辑。
以下是一个简洁、健壮且符合约束的实现:
public String printPalindrome(String sentence, int size) {
// 边界校验:负长度无意义,直接返回空
if (size < 0) return "";
// 若请求长度超过原字符串,自动截断为最大可行长度
if (size > sentence.length()) size = 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();
// 判断是否为回文(区分大小写;如需忽略大小写,可统一转小写再比较)
if (miniStr.equals(reverseStr)) {
return miniStr;
}
}
// 未找到符合条件的回文,返回空字符串
return "";
}✅ 关键设计说明:
- 使用 substring(i, i + size) 精确截取长度为 size 的子串,避免手动拼接字符或使用数组;
- 借助 StringBuilder.reverse() 实现高效、无数组的字符串反转(底层虽用数组,但对开发者透明,符合“不显式使用数组”的题意);
- 循环范围 i + size
- 默认区分大小写;如需忽略大小写(如 "RacEcar" → "cec" 场景),可将比较行改为:
if (miniStr.equalsIgnoreCase(reverseStr))
⚠️ 注意事项:
- 原问题中示例 "racecar" + size=3 期望输出 "cec",但 "cec" 并非 "racecar" 的连续子串——它跳过了中间字符。严格来说,"racecar" 中所有长度为 3 的连续子串为:"rac", "ace", "cec", "eca", "car",其中仅 "cec" 是回文。本方法确实会返回 "cec",前提是输入字符串本身包含该子串(即用户输入的是完整 "racecar",而非仅 "cec")。
- 若需求是“从原词中抽取任意 size 个字符重排构成回文”,则属组合问题,超出本解法范畴,且必然需要额外数据结构(如计数映射),与题设冲突。
- 方法返回 String 而非 boolean,符合“提取回文”这一核心目标;调用方可通过检查返回值是否为空判断是否存在。
综上,该方案以最少的内置工具、清晰的逻辑流和严谨的边界处理,精准满足“不使用数组、按指定长度提取首个回文子串”的要求,适用于教学及轻量级文本处理场景。










