(C#)最大公共子串

原创 2016年08月29日 18:35:20

这道算法题目,见了好多遍了,也没时间好好整理一下。这次稍微看了一点。

首先题目意思是这样的:

                                           两个字符串,求公共的连续子串的最大长度。

 例如:s1:  abcd    s2:bcde  则最大公共子串长度是3


首先,让我们看一下暴力解决:

<span style="font-size:18px;"> static int common(String s1, String s2)
        {
            int maxcount = 0;
            for (int i = 0; i < s1.Length; i++)
            {
                for (int j = 0; j < s2.Length; j++)
                {
                    if (s1[i] == s2[j])
                    {
                        int tempcount=0;
                        for (int k1 = i,k2=j; k1 < s1.Length && k2<s2.Length; k1++,k2++)
                        {
                            if (s1[k1] == s2[k2])
                            {
                                tempcount++;
                            }
                            else
                            {
                                break;
                            }
                        }
                        if (tempcount > maxcount)
                        {
                            maxcount = tempcount;
                        }
                    }
                }
            }
            return maxcount;
        }</span>
暴力解决,明显是三层循环啊,所以是O(n^3)

下面,让我们先看一下动态规划的优化第一步:计算len[i][j]=len[i-1][j-1](前提是两个字符相同的情况下)

<span style="font-size:18px;"> static int commonmax(string s1, string s2)
        {
            int[,] len=new int[s1.Length,s2.Length];
            int max = 0;
            for (int i = 0; i < s1.Length; i++)
            {
                for (int j = 0;j< s2.Length; j++)
                {
                    if (s1[i] == s2[j])
                    {
                        if (i == 0 || j == 0)
                        {
                            len[i,j] = 1;
                            if (max < len[i,j])
                            {
                                max = len[i,j];
                            }
                        }
                        else
                        {
                            len[i,j] = len[i - 1,j - 1]+1;
                            if (max < len[i,j])
                            {
                                max = len[i,j];
                            }
                        }
                    }
                    else
                    {
                        len[i,j] = 0;
                    }
                }
            }
            return max;
        }</span>

画一个简图看一下:

       (s2)  b  c     e

(s1)

            0  0    0   0

            1   0   0   0

            0    2   0  0

            0    0    0



相关文章推荐

两个字符串的最大公共子串

今天去面试,面试官出了一道题,求两个字符串的最大公共子串,一听
  • zdfjf
  • zdfjf
  • 2014年09月26日 21:04
  • 202

找出两个字符串的最大公共子串

#include #include #include #include using namespace std; /*不太合理的地方时返回堆内存 防止内存泄露的任务交给了函数调用者*/ char* G...

算法之插入、归并排序,最大公共子串lcs

一、插入排序/** * 插入排序 * * @param arr * @return * * @author xiaoshui (Emai...

POJ 2217-Secretary(后缀数组+高度数组-最大公共子串长度)

Secretary Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1382   Acce...
  • MIKASA3
  • MIKASA3
  • 2017年04月22日 08:14
  • 189

LCS求两个字符串的最大公共子串

//求两个字符串的公共最大子串 public class GetLCStringTest { public static String getLCSring(String str1, Strin...

算法题-两个字符串的最大公共子串

题目:给定一个query和一个text,均由小写字母组成。要求在text中找出以同样顺序连续出现在query中最长连续字母序列的长度。例如,query为“acbac”,text为“acaccbabb”...

N个字符串的最大公共子串 (暴力解法)

求两个字符串的最大公共子串,可以通过动态规划,很容易解决。但是遇到n个字符串的最大公共子串,就比较复杂了,网上都说需要通过后缀数组来解决,这个方法还在研究中,我先用暴力解法来跑跑,看看运行效率如何。 ...

HDU1080(最大公共子串LCS+DP)

Human Gene Functions Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Oth...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:(C#)最大公共子串
举报原因:
原因补充:

(最多只允许输入30个字)