华为OJ——查找两个字符串a,b中的最长公共子串
2017-07-31 15:55
537 查看
题目描述
查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。
输入描述:
输入两个字符串
输出描述:
返回重复出现的字符
示例1
输入
abcdefghijklmnop
abcsafjklmnopqrstuvw
输出
jklmnop
实现代码:
方法一:
思路:
①动态规划,注意c的长度需要预留n+1,方便递归初始化
②若出现多个,需要输出最短的字符串中,最先出现的一个子字符串,所以在做递归之前,需要 先判断谁短谁长。
方法二:
思路:
直接判断字符串是否包含另一个字符串的子字符串,来得出最长公共子串
查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。
输入描述:
输入两个字符串
输出描述:
返回重复出现的字符
示例1
输入
abcdefghijklmnop
abcsafjklmnopqrstuvw
输出
jklmnop
实现代码:
方法一:
思路:
①动态规划,注意c的长度需要预留n+1,方便递归初始化
②若出现多个,需要输出最短的字符串中,最先出现的一个子字符串,所以在做递归之前,需要 先判断谁短谁长。
package cn.c_shuang.demo62; import java.util.Scanner; /** * 查找两个字符串a,b中的最长公共子串 * @author Cshuang * */ public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); while (in.hasNextLine()){ String s1=in.nextLine(); String s2=in.nextLine(); System.out.println(lonComSub(s1,s2)); } in.close(); } private static String lonComSub(String a, String b) { int aLen=a.length()+1; int bLen=b.length()+1;//子所以要限制长度+1,方便c[0][0] int end=0; int max=0; if(aLen>bLen){//将较短的字符串放在前面 int temp; temp=aLen; aLen=bLen; bLen=temp; String s; s=a; a=b; b=s; } //事实上真正计数的从c[1][1]开始 int[][] c=new int[aLen][bLen]; for (int i = 1; i < aLen; i++) { for (int j = 1; j < bLen; j++) { if(a.charAt(i-1)==b.charAt(j-1)){ c[i][j] = c[i-1][j-1]+1; }else{ c[i][j]=0; } if(c[i][j]>max){ end=i; max=c[i][j]; } } } return a.substring(end-max,end); } }
方法二:
思路:
直接判断字符串是否包含另一个字符串的子字符串,来得出最长公共子串
import java.util.*; public class Main{ public static void main(String[] args){ Scanner in = new Scanner(System.in); while(in.hasNext()){ String s1 = in.nextLine(); String s2 = in.nextLine(); String max = s1.length() >= s2.length()?s1:s2; String min = s1.length() >= s2.length()?s2:s1; int l = 0; String s =""; for(int i=0;i<min.length();i++){ for(int j=i+1;j<=min.length();j++){ if(max.contains(min.substring(i,j)) && j-i>l){ l=j-i; s=min.substring(i,j); } } } System.out.println(s); } } }
相关文章推荐
- 华为OJ(查找两个字符串a,b中的最长公共子串)
- 华为OJ——查找两个字符串a,b中的最长公共子串
- 华为OJ——查找两个字符串a,b中的最长公共子串
- 华为oj中级 查找两个字符串a,b中的最长公共子串
- 华为OJ 公共字串计算&&查找两个字符串a,b中的最长公共子串
- 华为oj 查找两个字符串a,b中的最长公共子串
- 华为OJ中级题-查找两个字符串a,b中的最长公共子串
- 【华为OJ】【081-查找两个字符串a,b中的最长公共子串】
- 【华为oj】oj2034查找两个字符串a,b中的最长公共子串
- 华为机试在线训练-牛客网(30)查找两个字符串a,b中的最长公共子串
- 华为(8)查找两个字符串a,b中的最长公共子串
- 华为练习--查找两个字符串a,b中的最长公共子串
- 华为机试---查找两个字符串a,b中的最长公共子串
- OJ------查找两个字符串a,b中的最长公共子串
- java 查找两个字符串的最长公共子串
- 查找两个字符串a,b中的最长公共子串
- 查找两个字符串a,b的最长公共子串
- 查找两个字符串a,b中的最长公共子串
- JavaScript自定义函数实现查找两个字符串最长公共子串的方法
- 查找两个字符串的最长公共子串的Javascript函数