面试题:求字符串交集算法

本贴最后更新于 2542 天前,其中的信息可能已经时移世异

判断两个字符串的交集,比如:A="I love China" B="Feng Love Yun" 它们的交集为"love",请写出一个算法找出它。(写出伪代码或者思路即可)。

这道题我直接懵比了,求大神给个思路。。

-----------------------------分割线----------------------------------
更新:
参照网上的例子,自己写出了程序,运行成功,不知算不算优化。。
参照链接

自己的代码:

import  java.util.ArrayList;
import java.util.List;
/**
   * 字符串求交集算法:求两个字符串中的最大交集 * 例如:A="I love China", B="Feng Love Yun",它们的最大交集为“love”(忽略大小写) * 1。 取较短字符串跟较长字符串比较 * 2。 讲较短字符串穷举(由长到短穷举),用更小的字符串去跟较长字符串比较 * 3. 直到找到第一个匹配的子串时返回 * 
* Created on 2017/5/13.
 * @author pangwen
  * @version 0.1
 */
 public final class StringIntersection {

  private StringIntersection() {
	  throw new IllegalAccessError("cannot create instance.");
}

  public static String getIntersection(String a, String b, boolean ignorecase) {
	  if (null == a || null == b || a.trim().equals("") || b.trim().equals(""))
		  throw new IllegalArgumentException("字符串不能为空串!");
//如果忽略大小写则将字符串统一转化为小写
if (ignorecase) {
		  a = a.toLowerCase();
b = b.toLowerCase();
}
	  String result;
 if (a.length() < b.length()) {
		  //穷举a串的子串跟b比较
result = compile(a, b);
} else {
		  //穷举b的子串跟a比较
result = compile(b, a);
}

	  return result;
}

  private static String compile(String a, String b) {
	  String result = "";
flag:
	  for (int i = 0; i < a.length(); i++) {
		  List substrList = getSubstrList(a, i);
 for (String str : substrList) {
			  if (b.contains(str)) {
				  result = str;
 break flag;
}
		  }
	  }
	  return result;
}

  private static List getSubstrList(String str, int num) {
	  List substrList = new ArrayList<>();
 if (num == 0) {
		  substrList.add(str);
 return substrList;
}
	  int len = str.length();
 //第一个子串
substrList.add(str.substring(0, len - num));
//中间子串
for (int j = 1; j < num; j++) {
  substrList.add(str.substring(j, len - (num - j)));
}
//最后一个子串
substrList.add(str.substring(num));
	  return substrList;
}

  public static void main(String[] args) {

	  String a = "I love China", b = "Feng Love Yun";
 long start = System.currentTimeMillis();
String intersection = getIntersection(a, b, true);
 long end = System.currentTimeMillis();
System.out.println(intersection.trim() + "----> 耗时:"+(end -start)+"ms");
}
}
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    324 引用 • 1395 回帖
  • 算法
    388 引用 • 254 回帖 • 22 关注
  • 字符串
    28 引用 • 57 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • ht09qwe

    感觉你的代码排版很有问题

    1 回复
  • 其他回帖
  • feix 1 赞同

    看完题第一反应就是对 A/B 拆词后匹配另一个。。。貌似这不是算法~ 如果不能保证有语义的词汇,那就匹配字符咯。AB 两个串都构造一个 int[26],然后分别遍历字符,按照英文字母顺序匹配。契合了相应位置加 1.然后比对两个数组。一起不为 0 的就是交集。 😆

    1 回复
  • pangwen

    @88250 我贴出了自己写的代码实现,请帮忙分析一下 😊

  • pangwen

    谢谢! 😄

  • 查看全部回帖

推荐标签 标签

  • 笔记

    好记性不如烂笔头。

    304 引用 • 777 回帖
  • 倾城之链
    23 引用 • 66 回帖 • 102 关注
  • 程序员

    程序员是从事程序开发、程序维护的专业人员。

    534 引用 • 3528 回帖 • 1 关注
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    205 引用 • 357 回帖
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    941 引用 • 1458 回帖 • 153 关注
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 55 关注
  • WebClipper

    Web Clipper 是一款浏览器剪藏扩展,它可以帮助你把网页内容剪藏到本地。

    3 引用 • 9 回帖 • 5 关注
  • Sublime

    Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。

    10 引用 • 5 回帖
  • 互联网

    互联网(Internet),又称网际网络,或音译因特网、英特网。互联网始于 1969 年美国的阿帕网,是网络与网络之间所串连成的庞大网络,这些网络以一组通用的协议相连,形成逻辑上的单一巨大国际网络。

    96 引用 • 330 回帖
  • OAuth

    OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是 oAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 oAuth 是安全的。oAuth 是 Open Authorization 的简写。

    36 引用 • 103 回帖 • 8 关注
  • 开源中国

    开源中国是目前中国最大的开源技术社区。传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现、使用、并交流开源技术的平台。目前开源中国社区已收录超过两万款开源软件。

    7 引用 • 86 回帖 • 1 关注
  • LaTeX

    LaTeX(音译“拉泰赫”)是一种基于 ΤΕΧ 的排版系统,由美国计算机学家莱斯利·兰伯特(Leslie Lamport)在 20 世纪 80 年代初期开发,利用这种格式,即使使用者没有排版和程序设计的知识也可以充分发挥由 TeX 所提供的强大功能,能在几天,甚至几小时内生成很多具有书籍质量的印刷品。对于生成复杂表格和数学公式,这一点表现得尤为突出。因此它非常适用于生成高印刷质量的科技和数学类文档。

    9 引用 • 32 回帖 • 165 关注
  • 爬虫

    网络爬虫(Spider、Crawler),是一种按照一定的规则,自动地抓取万维网信息的程序。

    106 引用 • 275 回帖
  • gRpc
    10 引用 • 8 回帖 • 56 关注
  • 宕机

    宕机,多指一些网站、游戏、网络应用等服务器一种区别于正常运行的状态,也叫“Down 机”、“当机”或“死机”。宕机状态不仅仅是指服务器“挂掉了”、“死机了”状态,也包括服务器假死、停用、关闭等一些原因而导致出现的不能够正常运行的状态。

    13 引用 • 82 回帖 • 38 关注
  • 链书

    链书(Chainbook)是 B3log 开源社区提供的区块链纸质书交易平台,通过 B3T 实现共享激励与价值链。可将你的闲置书籍上架到链书,我们共同构建这个全新的交易平台,让闲置书籍继续发挥它的价值。

    链书社

    链书目前已经下线,也许以后还有计划重制上线。

    14 引用 • 257 回帖 • 5 关注
  • 持续集成

    持续集成(Continuous Integration)是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

    14 引用 • 7 回帖 • 2 关注
  • SVN

    SVN 是 Subversion 的简称,是一个开放源代码的版本控制系统,相较于 RCS、CVS,它采用了分支管理系统,它的设计目标就是取代 CVS。

    29 引用 • 98 回帖 • 692 关注
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖 • 1 关注
  • IDEA

    IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

    180 引用 • 400 回帖
  • 百度

    百度(Nasdaq:BIDU)是全球最大的中文搜索引擎、最大的中文网站。2000 年 1 月由李彦宏创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。

    63 引用 • 785 回帖 • 251 关注
  • sts
    2 引用 • 2 回帖 • 149 关注
  • Logseq

    Logseq 是一个隐私优先、开源的知识库工具。

    Logseq is a joyful, open-source outliner that works on top of local plain-text Markdown and Org-mode files. Use it to write, organize and share your thoughts, keep your to-do list, and build your own digital garden.

    4 引用 • 55 回帖 • 8 关注
  • NetBeans

    NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。

    78 引用 • 102 回帖 • 643 关注
  • JSON

    JSON (JavaScript Object Notation)是一种轻量级的数据交换格式。易于人类阅读和编写。同时也易于机器解析和生成。

    51 引用 • 190 回帖
  • HTML

    HTML5 是 HTML 下一个的主要修订版本,现在仍处于发展阶段。广义论及 HTML5 时,实际指的是包括 HTML、CSS 和 JavaScript 在内的一套技术组合。

    103 引用 • 294 回帖
  • Solo

    Solo 是一款小而美的开源博客系统,专为程序员设计。Solo 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    1425 引用 • 10043 回帖 • 470 关注