算法提高 最长字符序列

最长字符序列

问题描述

  设x(i), y(i), z(i)表示单个字符,则X={x(1)x(2)……x(m)},Y={y(1)y(2)……y(n)},Z={z(1)z(2)……z(k)},我们称其为字符序列,其中m,n和k分别是字符序列X,Y,Z的长度,括号()中的数字被称作字符序列的下标。
  如果存在一个严格递增而且长度大于0的下标序列{i1,i2……ik},使得对所有的j=1,2,……k,有x(ij)=z(j),那么我们称Z是X的字符子序列。而且,如果Z既是X的字符子序列又是Y的字符子序列,那么我们称Z为X和Y的公共字符序列。
  在我们今天的问题中,我们希望计算两个给定字符序列X和Y的最大长度的公共字符序列,这里我们只要求输出这个最大长度公共子序列对应的长度值。
  举例来说,字符序列X=abcd,Y=acde,那么它们的最大长度为3,相应的公共字符序列为acd。

输入格式

  输入一行,用空格隔开的两个字符串

输出格式

  输出这两个字符序列对应的最大长度公共字符序列的长度值

样例输入

aAbB aabb

样例输出

2

数据规模和约定

  输入字符串长度最长为100,区分大小写。

 1 import java.math.BigInteger;
 2 import java.util.Arrays;
 3 import java.util.Scanner;
 4
 5
 6 public class Main {
 7     static String a;
 8     static String b;
 9     static int max;
10     static StringBuffer s;
11     static StringBuffer s1;
12     public static void main(String[] args) {
13         Scanner input = new Scanner(System.in);
14         a = input.next();
15         b = input.next();
16         s = new StringBuffer();
17         s1 = new StringBuffer();
18         f(0);
19         System.out.println(max);
20
21     }
22     public static void f(int i){
23         int h;
24         for(h=i;h<a.length();h++){
25             s.append(a.charAt(h));
26             if(f1(s.toString())){
27                 if(max<s.length()){
28                     max = s.length();
29                 }
30             }
31             f(h+1);
32             s.deleteCharAt(s.length()-1);
33         }
34     }
35     public static boolean f1(String temp){
36         int j = 0;
37         for(int i=0;i<b.length();i++){
38             if(b.charAt(i)==temp.charAt(j)){
39                 j++;
40                 if(j==temp.length()){
41                     break;
42                 }
43             }
44         }
45         if(j==temp.length()) return true;
46         else return false;
47     }
48 }
时间: 2024-12-31 15:55:17

算法提高 最长字符序列的相关文章

算法10 最长等差序列问题

题目: 给定一个大小为n的数组,要求写出一个算法,求其最长的等差数列的子序列 分析: 该题需要分几种情况考虑. 1. 原数组是有序的,所要求的的子序列可以不连续. 对于数组arr[],不同的等差值d=1,2,3,4,5```(arr[max]-arr[min])可以求出不同的最长等差数列,然后在这些等差数列中求出最长的那个即可我们首先转化为求一个数组的固定等差值的最长等差子序列.如数组1,2,4,6,8,9,求等差值2的最长等差子序列为2,4,6,8 1.1 固定等差值的最长子序列 求符合条件的

数据结构与算法学习之路:LIS——最长递增序列的动态规划算法和二分思想算法

一.最长递增序列的问题描述: 求一个整数序列的最长递增子序列,子序列不要求是连续的.例如: Input:4,6,9,6,7,6,3,8,10:Output:5 二.解决方法: 1.用动态规划的方法解决.从问题我们可以知道,我们最终得到的最长递增子序列,其任意一段子序列也是对应序列中的最长子序列.这样说可能不好理解,就以上面的例子来说: 最长子序列为:4,6, 7, 8, 10.在这段子序列的子序列里选一个,例如:4,6,7.则4,6,7也是4,6,9,6,7,6,3这段序列的最长子序列. 对于动

动态规划算法解最长公共子序列LCS问题

第一部分.什么是动态规划算法 ok,咱们先来了解下什么是动态规划算法. 动态规划一般也只能应用于有最优子结构的问题.最优子结构的意思是局部最优解能决定全局最优解(对有些问题这个要求并不能完全满足,故有时需要引入一定的近似).简单地说,问题能够分解成子问题来解决. 动态规划算法分以下4个步骤: 描述最优解的结构 递归定义最优解的值 按自底向上的方式计算最优解的值   //此3步构成动态规划解的基础. 由计算出的结果构造一个最优解.   //此步如果只要求计算最优解的值时,可省略. 好,接下来,咱们

蓝桥杯 算法提高 学霸的迷宫 经典BFS问题

算法提高 学霸的迷宫 时间限制:1.0s   内存限制:256.0MB 问题描述 学霸抢走了大家的作业,班长为了帮同学们找回作业,决定去找学霸决斗.但学霸为了不要别人打扰,住在一个城堡里,城堡外面是一个二维的格子迷宫,要进城堡必须得先通过迷宫.因为班长还有妹子要陪,磨刀不误砍柴功,他为了节约时间,从线人那里搞到了迷宫的地图,准备提前计算最短的路线.可是他现在正向妹子解释这件事情,于是就委托你帮他找一条最短的路线. 输入格式 第一行两个整数n, m,为迷宫的长宽. 接下来n行,每行m个数,数之间没

【算法】最长公共子序列(nlogn)

转载注明出处:http://blog.csdn.net/wdq347/article/details/9001005 最长公共子序列(LCS)最常见的算法是时间复杂度为O(n^2)的动态规划(DP)算法,但在James W. Hunt和Thomas G. Szymansky 的论文"A Fast Algorithm for Computing Longest Common Subsequence"中,给出了O(nlogn)下限的一种算法. 定理:设序列A长度为n,{A(i)},序列B长

字符串算法之最长公共子序列

最长公共子序列,即 longest common subsequence,LCS.一个字符串删掉任意字符后所形成的字符串,不要求连续,注意和最长公共子串的区别. LCS的应用:论文查重,图形相似度比较,基因序列比较等. 暴力求解: 分别求出X.Y串的子序列,而后进行搜索比较,容易得到该算法复杂度为O(2^m · 2^n ),显然不可取 动态规划: 设有两个字符串X[1....m],Y[1....n],求其最长公共子串 假设Xi Yi为两个字符串从1开始数的第i个字符,若xm=yn,则xm必在最长

string基本字符序列容器(竞赛时常用的使用方法总结)

C语言只提供了一个char类型用来处理字符,而对于字符串,只能通过字符串数组来处理,而C++STL提供了string基本字符序列容器来处理字符串,可以将其理解为字符串类,它提供了添加,删除,替换.查找和比较等丰富.简洁的方法. 下面是在编写代码是的具体应用. 1 //关于C++ STL string基本字符系列容器的学习,看别人的代码一百遍,不如自己动手写一遍. 2 #include <string> 3 #include <vector> 4 #include <iostr

Linux工具开发[02]---编程实现对输入字符序列变换(编码/加密/散列)方式的智能判定

怎样简单实现一个能够智能判定输入字符序列变换方式的小程序 本文由CSDN-蚍蜉撼青松 [主页:http://blog.csdn.net/howeverpf]原创,转载请注明出处! 问题描写叙述: 在分析网络数据包或者研究安全问题时.经常会遇到变换后的字符序列.而是否能准确识别密文的变换算法,对进一步的分析工作非常关键. 经常使用的变换算法包含但不限于:Base64.URL编码.HTML编码.MD5散列.DES加密.RSA加密等. 要求: 1)在理解算法原理及密文特点的基础上.使用随意编程语言实现

Linux工具开发---2编程实现对输入字符序列变换(编码/加密/散列)方式的智能判定

如何简单实现一个可以智能判定输入字符序列变换方式的小程序 本文由CSDN-蚍蜉撼青松 [主页:http://blog.csdn.net/howeverpf]原创,转载请注明出处! 问题描述: 在分析网络数据包或者研究安全问题时,经常会遇到变换后的字符序列.而能否准确识别密文的变换算法,对进一步的分析工作很关键.常用的变换算法包括但不限于:Base64.URL编码.HTML编码.MD5散列.DES加密.RSA加密等.要求: 1)在理解算法原理及密文特点的基础上,使用任意编程语言实现,当输入一段密文