1、分割字符串(strsplit)

函数声明:
vector<string> strsplit( const string str, const string delim );

参数:
    str为待分割的字符串
    delim为分隔符的集合,注意:对"abcdeafghbi",如果delim是"abd",则结果是"c","e","fgh","i"

返回值:
    被分割后的子字符串向量

定义:
vector<string> strsplit( const string str, const string delim )
{
    
int cutAt;
    
    
string lstr = str;
    vector
<string> result;
    
    
while( (cutAt = lstr.find_first_of(delim)) != lstr.npos )
    {
        
if(cutAt > 0)
        {
            result.push_back(lstr.substr(
0,cutAt));
        }
        
        lstr 
= lstr.substr(cutAt+1);
    }
    
    
if(lstr.length() > 0)
    {
        result.push_back(lstr);
    }
    
    
return result;
}

2、求最长递减子序列(FindLDS)

函数声明:
template<class T>
void FildLDS(const vector<T> seq, const int ipos, vector<vector<int> > &results );

参数:
    seq为待求值的序列,可谓任何具有小于运算符 "<" 的类型或类的向量
    ipos为开始求值的位置(向量的下标,从0开始)
    results为所有最长递减子序列的集合,分别以各元素在原序列中的位置(下标)表示

返回值:
    无

定义:
template<class T>
void FildLDS( const vector<T> seq, const int ipos, vector< vector<int> > &results )
{
    
// 不需要初始化?
    static vector<int> vcursub;

    
//---------------
    for(int i = ipos; i < seq.size(); i++)
    {
        
if((vcursub.size() <= 0|| seq[i] < seq[ vcursub.back() ] )
        {
            vcursub.push_back(i);

            FildLDS(seq, i
+1, results);
        }
    }
    
    
if(results.size() <= 0)
    {
        results.push_back(vcursub);
    }
    
else if( results.back().size() < vcursub.size())
    {
        results.clear();
        results.push_back(vcursub);
    }
    
else if( results.back().size() == vcursub.size())
    {
        results.push_back(vcursub);
    }

    
if!vcursub.empty() )
    {
        vcursub.pop_back();
    }
    
    
return ;
}


举例:
    请下载实例:(win2k + VC6 下通过)
    LDS.rar(新)

以前为了应付老师,急忙中弄了一个。现在改进了一些。
    以前那个蠢的程序在这里LDS.rar
Posted on 2007-10-22 03:04  Soli  阅读(1654)  评论(3编辑  收藏  举报