如何从字符串中提取指定长度的第一个回文子串(不使用数组)

发布时间 - 2025-12-29 00:00:00    点击率:

本文介绍一种不依赖数组的纯字符串操作方法,用于在用户输入的句子中查找指定长度的第一个回文子串,并返回该回文;若不存在则返回空字符串。

在实际开发中,我们常需从一段文本中提取满足特定条件的子串,例如:给定一个字符串和目标长度 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,符合“提取回文”这一核心目标;调用方可通过检查返回值是否为空判断是否存在。

综上,该方案以最少的内置工具、清晰的逻辑流和严谨的边界处理,精准满足“不使用数组、按指定长度提取首个回文子串”的要求,适用于教学及轻量级文本处理场景。


# java  # 工具 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: javascript中数组(Array)对象和字符串(String)对象的常用方法总结  安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出  Laravel如何使用Vite进行前端资源打包?(配置示例)  微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】  为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】  Laravel如何使用withoutEvents方法临时禁用模型事件  QQ浏览器网页版登录入口 个人中心在线进入  晋江文学城电脑版官网 晋江文学城网页版直接进入  Laravel如何配置Horizon来管理队列?(安装和使用)  如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环  如何在服务器上配置二级域名建站?  西安专业网站制作公司有哪些,陕西省建行官方网站?  javascript读取文本节点方法小结  如何为不同团队 ID 动态生成多个非值班状态按钮  html如何与html链接_实现多个HTML页面互相链接【互相】  悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤  通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】  EditPlus中的正则表达式 实战(1)  网站制作企业,网站的banner和导航栏是指什么?  Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧  Python面向对象测试方法_mock解析【教程】  Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南  如何在云虚拟主机上快速搭建个人网站?  Python函数文档自动校验_规范解析【教程】  html5如何实现懒加载图片_ intersectionobserver api用法【教程】  如何在万网开始建站?分步指南解析  Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道  Laravel如何创建自定义Facades?(详细步骤)  海南网站制作公司有哪些,海口网是哪家的?  微信小程序 闭包写法详细介绍  如何基于云服务器快速搭建个人网站?  利用vue写todolist单页应用  网站制作免费,什么网站能看正片电影?  高防服务器租用如何选择配置与防御等级?  简历没回改:利用AI润色让你的文字更专业  laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法  Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中  Android自定义listview布局实现上拉加载下拉刷新功能  制作公司内部网站有哪些,内网如何建网站?  百度浏览器如何管理插件 百度浏览器插件管理方法  如何在Ubuntu系统下快速搭建WordPress个人网站?  济南网站建设制作公司,室内设计网站一般都有哪些功能?  微信小程序 require机制详解及实例代码  实现点击下箭头变上箭头来回切换的两种方法【推荐】  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法  简历在线制作网站免费版,如何创建个人简历?  Win11怎么设置默认图片查看器_Windows11照片应用关联设置  如何在阿里云虚拟主机上快速搭建个人网站?  Laravel如何使用.env文件管理环境变量?(最佳实践)