题目描述

查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。

输入描述:

输入两个字符串

输出描述:

返回重复出现的字符
示例1

输入

abcdefghijklmnop
abcsafjklmnopqrstuvw

输出

jklmnop

代码如下:

 package com.yzh.hehe;

 import java.util.Scanner;

 public class LongestSubStrBetweenAB {

     public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
while (scanner.hasNext()) {
String a=scanner.nextLine();
String b=scanner.nextLine();
System.out.println(longestSubBetweenAB2(a, b));
}
scanner.close(); } private static String longestSubBetweenAB(String a, String b) {
int alength=a.length();
int blength=b.length();
//保证a串为较短串
if (alength>blength) {
String temp=a;
int tempLength=alength;
alength=blength;
blength=tempLength;
a=b;
b=temp;
}
//从较短串整串开始,长度依次递减从左向右得到较短串子串,如果较长串中包含此子串,即为目标子串
for (int i=alength; i> 0; i--) {
int count=alength-i+1;
for (int j = 0; j < count; j++) {
if (b.contains(a.substring(j, j+i))) {
return a.substring(j,j+i);
}
}
}
return null;
} // 动态规划解决最长子串问题
private static String longestSubBetweenAB2(String a,String b) {
int alength=a.length();
int blength=b.length();
//保证a串为较短串
if (alength>blength) {
String temp=a;
int tempLength=alength;
alength=blength;
blength=tempLength;
a=b;
b=temp;
}
int[][]arr=new int[alength+1][blength+1];
String[][] sArr=new String[alength+1][blength+1];
StringBuilder stringBuilder=new StringBuilder();
String resultString=null;
int result=0;
for (int i = 0; i <= alength; i++) {
for (int j = 0; j <= blength; j++) {
if (i==0||j==0) {
arr[i][j]=0;
sArr[i][j]="";
}else if (a.charAt(i-1)==b.charAt(j-1)) {
arr[i][j]=arr[i-1][j-1]+1;
// stringBuilder.append(b.charAt(j-1));
sArr[i][j]=sArr[i-1][j-1]+a.charAt(i-1);
if (arr[i][j]>result) {
result=arr[i][j];
resultString=sArr[i][j];
} }else {
arr[i][j]=0;
sArr[i][j]="";
// stringBuilder.delete(0, stringBuilder.length());
}
}
}
if (resultString.length()==0) {
return null;
}
return resultString; }
}

解题10(LongestSubStrBetweenAB)的更多相关文章

  1. linux系统无法正常启动,故障排查恢复

    linux内核启动修复 首先看linux内核重要文件grub.conf # grub.conf generated by anaconda # # Note that you do not have ...

  2. linux内核启动修复

    linux内核启动修复 首先看一下linux内核重要文件grub.conf 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 # gru ...

  3. 10.30 NFLS-NOIP模拟赛 解题报告

    总结:今天去了NOIP模拟赛,其实是几道USACO的经典的题目,第一题和最后一题都有思路,第二题是我一开始写了个spfa,写了一半中途发现应该是矩阵乘法,然后没做完,然后就没有然后了!第二题的暴力都没 ...

  4. SICP 习题 (1.10)解题总结

    SICP 习题 1.10 讲的是一个叫“Akermann函数”的东西,去百度查可以查到对应的中文翻译,叫“阿克曼函数”. 就像前面的解题总结中提到的,我是一个数学恐惧者,看着稍微复杂一点的什么函数我就 ...

  5. SICP 习题 (2.10)解题总结: 区间除法中除于零的问题

    SICP 习题 2.10 要求我们处理区间除法运算中除于零的问题. 题中讲到一个专业程序猿Ben Bitdiddle看了Alyssa的工作后提出了除于零的问题,大家留意一下这个叫Ben的人,后面会不断 ...

  6. 【LeetCode】1012. Complement of Base 10 Integer 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  7. 【九度OJ】题目1208:10进制 VS 2进制 解题报告

    [九度OJ]题目1208:10进制 VS 2进制 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1208 题目描述: 对于一 ...

  8. 2016/10/28 很久没更了 leetcode解题 3sum问题进阶版4sum

    18. 4Sum Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c  ...

  9. 2016/10/28 很久没更了 leetcode解题 3sumcloset

    16.3Sum Closest Given an array S of n integers, find three integers in S such that the sum is closes ...

随机推荐

  1. [多线程]线程基础(对象锁、class锁、同步、异步)

    synchronized.volatile.ReentrantLock.concurrent 线程安全:当多个线程访问某一个类(对象或方法)时,这个类始终都能表现出正确的行为,那么这个类(对象或方法) ...

  2. Nginx配置HTTPS证书网站

    前提: 1.主机需要先安装openssl     2.编译安装nginx时,要加上--with-http_ssl_module  这个ssl模块 现在开始配置:(我当时配置时,主机已安装了openss ...

  3. Android开发中常见的设计模式(一)——单例模式

    首先了解一些单例模式的概念. 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 这样做有以下几个优点 对于那些比较耗内存的类,只实例化一次可以大大提高性能,尤其是在移动开发中. 保持 ...

  4. Android悬浮窗及其拖动事件

    主页面布局很简单,只有一个RelativelyLayout <?xml version="1.0" encoding="utf-8"?> <R ...

  5. Redis 内存溢出过期策略

    1: 设置内存最大值, 如果该主机只作为 redis 服务器, 无其它比较占用资源的服务, 建议设置为内存的 3/4 大小, 单位 B 2: 设置内存溢出解决策略, 推荐 1-5 任选一种, 不推荐 ...

  6. C# Uditor 富文本的部署

    <1> 先到http://ueditor.baidu.com/website/download.html去下载对应编程语言的版本(以.net为例) <二> 将下载下来的文件解压 ...

  7. Python集合的基本操作

    #-*coding:utf-8 -* list =set([2,3,4]) list2 =set([5,3,7]) #交集 #print (list.intersection(list2)) #并集 ...

  8. C语言复习:内存模型2

    函数调用模型 基本原理 实际上就是不断的从一个内存跳到另一个内存. 函数调用变量传递分析 一个主程序有n函数组成,c++编译器会建立有几个堆区?有几个栈区? 答:一个程序只有一个堆区和一个栈区. 函数 ...

  9. Django后台邮箱配置

    Django可以通过发送邮件的方式找回密码,具体细节可以看Django的文档,这里只介绍在settings.py中如何正确进行邮箱的相关配置. 网上很多教程都说了需要在settings.py里添加如下 ...

  10. android Button、TabLayout英文自动改小写为大写的问题

    如果是Button自动大写问题,直接设置Button的 textAllCaps="false" 即可: 如果是TabLayout出现全大写问题,先在style.xml加入属性: & ...