Java 最长子序列和最长子串

  • 最长子序列:匹配的字符不需要连续。
  • 最长子串: 匹配的字符需要连续,可能有多种结果。

解决思路:将输入字符串1看作行, 输入字符串2看作列,构成二位数组,然后将对角线匹配字符的值标记为1,计算满足条件的匹配字符个数即可。

基本思想: 空间换时间,动态规划。

图解与公式(只针对最长子序列,最长子串类似)

状态转移方程

直观版:

最长子序列

 1     /**
 2      * find longest common sequence from two input string
 3      * @param s1
 4      * @param s2
 5      * @return length of longest common sequence
 6      */
 7     public static int LCS(String s1, String s2) {
 8         int[][] c = new int[s1.length()][s2.length()];
 9
10         // initialize the elements without top left element
11         for(int i=0; i<s1.length();i++){
12             if (s1.charAt(i) == s2.charAt(0)) {
13                 c[i][0] = 1;
14             }
15         }
16         for(int j = 0; j<s2.length();j++){
17             if (s1.charAt(0) == s2.charAt(j)) {
18                 c[0][j] = 1;
19             }
20         }
21         for (int i = 1; i < s1.length(); i++) {
22             for (int j = 1; j < s2.length(); j++) {
23                 if (s1.charAt(i) == s2.charAt(j)) {
24                     c[i][j] = c[i - 1][j - 1] + 1;
25                 } else if (c[i][j - 1] > c[i - 1][j]) {
26                     c[i][j] = c[i][j - 1];
27                 } else {
28                     c[i][j] = c[i - 1][j];
29                 }
30             }
31         }
32         return c[s1.length() - 1][s2.length() - 1];
33     }

最长子序列也可以用稳定的排序算法先排序,再匹配。如采用归并排序算法(注意,快速排序不稳定)。

最长子串

 1     /**
 2      * find longest substring from two input string
 3      *
 4      * @param s1
 5      * @param s2
 6      * @return length of longest substring
 7      */
 8     public static int LSS(String s1, String s2) {
 9         int[][] c = new int[s1.length()][s2.length()];
10         int max = 0;
11
12         // initialize the elements without top left element
13         for(int i=0; i<s1.length();i++){
14             if (s1.charAt(i) == s2.charAt(0)) {
15                 c[i][0] = 1;
16             }
17         }
18         for(int j = 0; j<s2.length();j++){
19             if (s1.charAt(0) == s2.charAt(j)) {
20                 c[0][j] = 1;
21             }
22         }
23
24         for (int i = 1; i < s1.length(); i++) {
25             for (int j = 1; j < s2.length(); j++) {
26                 if (s1.charAt(i) == s2.charAt(j)) {
27                     c[i][j] = c[i - 1][j - 1] + 1;
28                     if (c[i][j] > max) {
29                         max = c[i][j];
30                     }
31                 }
32             }
33         }
34         return max;
35     }

优化版:

待续..

优化基本思想:

可以采用递归方式,尽早舍弃不符合要求的匹配。

对于优化最长子串,

  可以优先查找最长子串,如果发现一个匹配,就一直找下去,同时将最终的不匹配标记为-1而不是0.

  如果剩余的可能匹配长度小于已找到的长度,则停止递归操作,直接return.

其他相关算法

Horspool‘s Algorithm and Boyer-Moore Algorithm

时间: 2024-11-14 20:01:33

Java 最长子序列和最长子串的相关文章

单调递增最长子序列 - 从最长公共子序列到单调递增最长子序列

最长公共子序列 的 算法思路 在这里 点击进入  将 代码稍微改动一下 就可以   ,   最长公共子序列  是两个 字符串求 公共子序列  , 可以将其中的 一个 改为 从 a 到 z  这样输入另一个 就得到了  单调递增最长子  序列  下面附上题目 和 代码 最长公共子序列 的 算法思路 在这里 点击进入  将 代码稍微改动一下 就可以   ,   最长公共子序列  是两个 字符串求 公共子序列  , 可以将其中的 一个 改为 从 a 到 z  这样输入另一个 就得到了  单调递增最长子

1478 括号序列的最长合法子段

1478 括号序列的最长合法子段 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 这里有另一个关于处理合法的括号序列的问题. 如果插入“+”和“1”到一个括号序列,我们能得到一个正确的数学表达式,我们就认为这个括号序列是合法的.例如,序列"(())()", "()"和"(()(()))"是合法的,但是")(", "(()"和"(

求最大子串和 最长子串的java写法

同事去面试问到求最大和的子串,举例来说给你一个有正有负的数组, 1 -1 2 -4 5 6 -3,它的最大和就是 5 6 所组成的子串和11.根据其隔离性,即任何子串内部都不会有这样一个结构 2 -4,因为如果包含这个子串,必定不是最大子串(2-4<0),因此可以根据此性质,将数组进行分割,而分割的标志就是小于0的结构. 1 public static void main(String[] args) { 2 3 int[] array = {1,2,-4,3,5,-4,7,8,2,-1,6,-

LeetCode--003--无重复字符的最长子串(java)

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3. 示例 2: 输入: "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1. 示例 3: 输入: "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke&qu

_____________________________________动态规划之最长子序列问题______1:两个序列中的______________________________________

动态规划之最长自序列问题....两个字符串中的最长子序列问题. 参考例题杭电1159.....参考文件.lcy老师的课件....在此对lcy老师致敬.. 最长子序列问题....... 下面附上题目 Online Judge Online Exercise Online Teaching Online Contests Exercise Author F.A.Q Hand In Hand Online Acmers Forum | Discuss Statistical Charts Proble

NYOJ17,单调递增最长子序列

单调递增最长子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 求一个字符串的最长递增子序列的长度 如:dabdbf最长递增子序列就是abdf,长度为4 输入 第一行一个整数0<n<20,表示有n个字符串要处理 随后的n行,每行有一个字符串,该字符串的长度不会超过10000 输出 输出字符串的最长递增子序列的长度 样例输入 3 aaa ababc abklmncdefg 样例输出 1 3 7 来源 经典题目 也是到经典的DP题,另一种思路是,就a-z的一个字符

HDU 1513 最长子序列

Palindrome Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3641    Accepted Submission(s): 1252 Problem Description A palindrome is a symmetrical string, that is, a string read identically from

No.3. 无重复字符的最长子串

3. 无重复字符的最长子串 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度.就是说,找一个最长的子串,这个子串没有重复字符 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3. 示例 2: 输入: "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1. 示例 3: 输入: "pwwkew"

nyoj 题目17 单调递增最长子序列

单调递增最长子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 求一个字符串的最长递增子序列的长度如:dabdbf最长递增子序列就是abdf,长度为4 输入 第一行一个整数0<n<20,表示有n个字符串要处理随后的n行,每行有一个字符串,该字符串的长度不会超过10000 输出 输出字符串的最长递增子序列的长度 样例输入 3 aaa ababc abklmncdefg 样例输出 1 3 7 复习了利用二分搜索和额外空间解决最长递增子序列问题,最重要的是二分搜索的