求字符串A与字符串B的最长公共字符串(JAVA)

思路:引入一个矩阵的思想,把字符串A(长度为m)当成矩阵的行,把字符串B(长度为n)当矩阵的列,这样就构成一个m*n的矩阵。若该矩阵的节点对应的字符相同,即m[i]=n[j]时,该节点值为1;当前字符相同节点的值 = 左上角(d[i-1, j-1])的值 +1,这样当前节点的值就是最大公用子串的长。只需以行号和最大值为条件即可截取最大子串。

public String getLongest(String s1,String s2){
        if(s1==null ||s2==null){
            return null;
        }
        if(s1.equals(s2)){
            return s1;
        }
        int length = 0;
        int end = 0;
        int[][] a = new int[s1.length()][s2.length()];
        char[] char1=s1.toCharArray();
        char[] char2=s2.toCharArray();
        for (int i = 0; i < s1.length(); i++)
        {
            for (int j = 0; j < s2.length(); j++)
            {
                int n = (i - 1 >= 0 && j - 1 >= 0) ? a[i - 1][j - 1] : 0;
                //当前值为上一结点值加1即a[i][j]=a[i-1][j-1]+1;
                a[i][j] =(char1[i] == char2[j]) ? 1+n : 0;
               //判断是否大于之前的最长字符串长度
                if (a[i][j] > length)
                {  //保持length为最长公共字符串长度
                    length = a[i][j];
                    //end 为最长公共字符串末尾
                    end = i;
                }
            }
        }
        return s1.substring(end - length + 1, end+1);
    }
时间: 2024-10-09 22:27:19

求字符串A与字符串B的最长公共字符串(JAVA)的相关文章

poj 1226 hdu 1238 Substrings 求若干字符串正串及反串的最长公共子串 2002亚洲赛天津预选题

题目:http://poj.org/problem?id=1226 http://acm.hdu.edu.cn/showproblem.php?pid=1238 其实用hash+lcp可能也可以,甚至可能写起来更快,不过我没试,我最近在练习后缀数组,所以来练手 后缀数组的典型用法之一----------------后缀数组+lcp+二分 思路:1.首先将所有的字符串每读取一个,就将其反转,作为一组,假设其下标为i到j,那么cnt[i]到cnt[j]都标记为一个数字(这个数字意思是第几个读入的字符

Java算法——求出两个字符串的最长公共字符串

问题:有两个字符串str1和str2,求出两个字符串中最长公共字符串. 例如:“acbbsdef”和"abbsced"的最长公共字符串是“bbs” 算法思路: 1.把两个字符串分别以行和列组成一个二维矩阵. 2.比较二维矩阵中行和列对应的每个点的字符是否相同,是设置这个点为1,否设置这个点为0. 3.通过查找值为1的最长对角线来找到最长公共字符串. 通过上面str1和str2两个字符串,分别得出以行和列组成的一个二维矩阵如下图: 从上图可以看到,str1和str2共有3个公共子串&qu

Acwing779 最长公共字符串后缀

题目大意:给定n个字符串,让你找到他们的最长公共字符串后缀是什么,可能为空. 分析:题目数据范围比较小,可以O(n*n)暴力匹配,即可解决这道问题.之所以写这道题的题解还是因为写字符串的题还不够多啊,菜的一批. 代码: #include<bits/stdc++.h> using namespace std; string common(string s,string t) { int most = 0; int len = min(s.length(), t.length()); for (i

求两个字符串的最长公共子串——Java实现

要求:求两个字符串的最长公共子串,如"abcdefg"和"adefgwgeweg"的最长公共子串为"defg"(子串必须是连续的) public class Main03{ // 求解两个字符号的最长公共子串 public static String maxSubstring(String strOne, String strTwo){ // 参数检查 if(strOne==null || strTwo == null){ return null

求一个字符串中出现相同且长度最长的字符串

题目:输入一行字符串,找出其中出现的相同且长度最长的字符串,输出它及其首字符的位置.                例如:"yyabcdabjcabceg",输出结果应该为abc 和3. #include<iostream> #include<string> using namespace std; int main() { string str, tep; cout << "输入字符串" << endl; cin &

求一个字符串中出现同样且长度最长的字符串

题目:输入一行字符串.找出当中出现的同样且长度最长的字符串,输出它及其首字符的位置.                比如:"yyabcdabjcabceg",输出结果应该为abc 和3. #include<iostream> #include<string> using namespace std; int main() { string str, tep; cout << "输入字符串" << endl; cin &

回文字符串(南阳oj37)(最长公共子序列问题)

回文字符串 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba".当然,我们给你的问题不会再简单到判断一个字符串是不是回文字符串.现在要求你,给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串. 输入 第一行给出整数N(0<N<100) 接下来的N行,每行一个字符串,每个字符串长度不超过1000. 输出 每行输出所需添加的最少字符

C++练习 | 最长公共字符串(DP)

HDU 1159.Common Subsequence #include<iostream> #include<stdio.h> #include<string> #include<cstring> #include<string.h> using namespace std; int dp[10007][10007];//a的前i个字母与b的前j个字母的有序交集长度 int main() { // freopen("01.in&quo

求序列1和序列2的最长公共子序列-基于动态规划方法

1 #include <cstdlib> 2 #include <iostream> 3 #include <cstring> 4 5 using namespace std; 6 7 class maxlen_string 8 { 9 public: 10 void string_(); 11 void LCSLength(int,int,char*,char*,int**,int**); 12 void LCS(int,int,char*,int**); 13 ~m