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