0

0

查找所有字符串的最长公共子串(Java 实现)

霞舞

霞舞

发布时间:2026-03-01 12:50:02

|

619人浏览过

|

来源于php中文网

原创

查找所有字符串的最长公共子串(Java 实现)

本文介绍如何在 Java 中高效找出 n 个输入字符串的最长公共子串(Longest Common Substring),要求该子串必须严格出现在所有字符串中,否则输出空字符串;代码兼顾正确性与可读性,并指出关键逻辑陷阱与优化建议。

本文介绍如何在 java 中高效找出 n 个输入字符串的**最长公共子串**(longest common substring),要求该子串必须**严格出现在所有字符串中**,否则输出空字符串;代码兼顾正确性与可读性,并指出关键逻辑陷阱与优化建议。

要解决“给定 n 个字符串,找出同时存在于所有字符串中的最长连续子串”这一问题,核心在于:以第一个字符串为基准,枚举其所有可能的子串,逐一验证是否在其余每个字符串中均存在。只有当某子串在全部 n 个字符串中都出现时,才具备候选资格;在所有合格子串中取长度最大者即为答案。

以下是一个结构清晰、逻辑严谨的 Java 实现:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int n = input.nextInt(); // 使用 int 更安全(避免 byte 溢出)
        input.nextLine(); // 消费换行符,防止 nextLine() 读取异常

        String[] words = new String[n];
        for (int i = 0; i < n; i++) {
            words[i] = input.nextLine().trim(); // 安全读取并去除首尾空白
        }

        System.out.println(findLongestCommonSubstring(words));
    }

    public static String findLongestCommonSubstring(String[] words) {
        if (words == null || words.length == 0) return "";
        if (words.length == 1) return words[0]; // 边界情况:单字符串即自身

        String base = words[0];
        String longest = "";

        // 枚举 base 的所有子串:从长到短遍历可提前终止(优化点)
        // 这里采用常规从短到长 + 最终更新,更易理解;实际生产推荐“长度降序+首次命中即返回”
        for (int i = 0; i < base.length(); i++) {
            for (int j = i + 1; j <= base.length(); j++) {
                String candidate = base.substring(i, j);

                // 检查 candidate 是否存在于其余所有字符串中
                boolean isCommon = true;
                for (int k = 1; k < words.length; k++) {
                    if (!words[k].contains(candidate)) {
                        isCommon = false;
                        break;
                    }
                }

                // 更新最长有效子串
                if (isCommon && candidate.length() > longest.length()) {
                    longest = candidate;
                }
            }
        }

        return longest;
    }
}

关键实现说明:

HaloTool
HaloTool

AI工具在线集合网站

下载
  • 基准选择:以 words[0] 为枚举源,因其子串数量最少(减少冗余),且能覆盖所有可能解(公共子串必在任一字符串中出现)。
  • 存在性检查:使用 String.contains() 替代手动循环截取比对,语义清晰、代码简洁、不易出错(原答案中嵌套 k 循环的边界条件 k
  • 边界防护:添加 null/空数组校验、单字符串特例处理,并用 trim() 避免因输入空格导致误判。
  • 输入健壮性:input.nextInt() 后调用 input.nextLine() 消费残留换行符,防止后续 nextLine() 读取为空。

⚠️ 注意事项与常见误区:

立即学习Java免费学习笔记(深入)”;

  • ❌ 不是“最长公共子序列(LCS)”:子串要求连续字符,而子序列允许不连续,二者算法完全不同。
  • ❌ 不是“公共前缀”:如 "abc" 和 "abx" 公共前缀为 "ab",但公共子串还包括 "a"、"b"、"c"(若存在)、"ab" 等,需穷举所有位置。
  • ⚠️ 时间复杂度为 O(L³ × n)(L 为平均字符串长度),适用于小规模输入(n ≤ 10,L ≤ 100)。若需处理大规模数据,应改用后缀数组或广义后缀自动机(SAM)等高级算法。
  • ? 输出为空字符串 "" 表示无任何非空公共子串(包括长度为 1 的字符),符合题目“一个缺失即不输出”的要求。

? 总结:本方案以清晰逻辑优先,在保证正确性的前提下提升可维护性。掌握此基础实现后,可进一步探索基于滚动哈希(Rabin-Karp)的优化版本,或封装为通用工具方法(如支持自定义比较器、忽略大小写等),以适配更复杂的业务场景。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

890

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

248

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

947

2024.03.01

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

658

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

219

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1560

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

645

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

1088

2024.03.22

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

24

2026.02.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4万人学习

C# 教程
C# 教程

共94课时 | 10.5万人学习

Java 教程
Java 教程

共578课时 | 74.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号