zoukankan      html  css  js  c++  java
  • 求两个字符串的最长公共子串

    /*
    算法原理
    LCS[i,j]	= 0				(i<0||j<0)
    			  LCS(i-1,j-1)	(i>=0 && b>0 && (str1[i]==str2[j]))
    (1) 构造一个str1.size()*str2.size()的矩阵vec
    (2) 如果 str1[i] == str2[j],则vec[i][j] = vec[i-1][j-1]+1;
    */
    string LCS(string const &str1,string const & str2)
    {
    	if(str1.size()>str2.size())
    		return LCS(str2,str1);
    
    	vector<vector<int> > vec;
    	vec.resize(str1.size());
    	for(int i=0;i<(int)str1.size();++i)
    	{
    		vec[i].resize(str2.size());
    	}
    
    	int iIndex = -1;
    	int iMax = 0;
    	for(int i = 0;i<(int)str1.size();++i)
    	{
    		for(int j = 0;j<(int)str2.size();++j)
    		{
    			if(str1[i] == str2[j])
    			{
    				int n = 1+((i>0&&j>0)?vec[i-1][j-1]:0);
    				vec[i][j] = n;
    				if(iMax<n)
    				{
    					iMax = n;
    					iIndex = i;
    				}
    			}
    		}
    	}
    	if(iIndex == -1)
    		return (string());
    	return str1.substr(iIndex-iMax+1,iMax);
    }
    
    
    //因为每一次的比较都是只用到第i列的结果,所以我们可以只使用一个一维数组来保存结果即可
    string LCSEx(string const &str1,string const & str2)
    {
    	if(str1.size()>str2.size())
    		return LCS(str2,str1);
    
    	vector<int> vec(str2.size());
    	int iIndex = -1;
    	int iMax = 0;
    	for(int i = 0;i<(int)str1.size();++i)
    	{
    		for(int j = (int)str2.size()-1;j>=0;--j)
    		{
    			if(str1[i] == str2[j])
    			{
    				int n = 1+(j>0?vec[j-1]:0);
    				vec [j] = n;
    				if(iMax<n)
    				{
    					iMax = n;
    					iIndex = i;
    				}
    			}
    			else
    			{
    				vec[j] = 0;
    			}
    		}
    	}
    	if(iIndex == -1)
    		return (string());
    	return str1.substr(iIndex-iMax+1,iMax);
    }
    

  • 相关阅读:
    工作中常用的工具
    lua 调试、热重载
    Lua库收集
    Mac常见端口
    Swift 学习笔记1
    项目-微博(模仿新浪微博)
    iOS多线程
    iOSCoreData介绍
    iOS数据库操作流程
    iOS中数据库运用之前的准备-简单的数据库
  • 原文地址:https://www.cnblogs.com/SammyLan/p/1880036.html
Copyright © 2011-2022 走看看