您的位置:首页 > 其它

贴两个算法:分割字符串(strsplit) 和 求最长递减子序列(FindLDS),并附实例。(已更新)

2007-10-22 03:04 274 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐