贴两个算法:分割字符串(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
函数声明:
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
相关文章推荐
- 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串
- 给定一个01串(仅由‘ 0’或‘1’组成的字符串),现在想把这个数字串排序成“非递减”有序序列,请问至少需要多少次交换(任意两个位置交换)
- 将中文字符串分割为数组 解决str_split中文乱码php
- 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串
- 最长公共子串序列一之两个字符串的最长公共子序列
- js split 的用法和定义 js split分割字符串成数组的实例代码
- JavaScript字符串对象split方法入门实例(用于把字符串分割成数组)
- 一个看似简单却复杂的问题:求两个字符串的 左向右匹配 所有的 最长连续的 公共子字符串( 在每个字符串中先后次序相同的) 序列
- 字符串---分割成数组(str_split ),算出一个字符串中出现最多的字符, 学校中最多的姓名
- python 字符串创建,遍历,切片,格式化ljust rjust center,find,replace,split,repr,str
- 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串 (转)
- 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串
- 面试宝典_Python.常规算法.0002.输出任意两个字符串中最长公共子串?
- ] 找工作知识储备(2)---数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串
- 将中文字符串分割为数组 解决str_split中文乱码php
- 编写算法,对给定的字符串str,返回其最长重复子串及其下标位置
- js split 的用法和定义 js split分割字符串成数组的实例代码
- 获取两个字符串之间最长公共字符串的算法(PHP)
- 笔试算法题(35):最长递增子序列 & 判定一个字符串是否可由另一个字符串旋转得到
- 【Python】实现字符串分割功能 类似于str.split()