有两种算法:(len为模式串长度,T[]为模式串)
1、i = 1; j = 0; next[1] = 0;
while(i<len)
{
if((j == 0)||(T[i] == T[j]))
{
i++; j++;
next[i] = j;
}
else
j = next[i];
}
2、i = 1; j = 0; next[1] = 0;
while(i<len)
{
if((j == 0)||(T[i] == T[j]))
{
i++; j++;
if(T[i] != T[j])
next[i] = j;
else
next[i] = next[j];
}
else
j = next[i];
}
总的来说第二种方法相对于第一种方法有改进,因为第一种方法在一些情况下有缺陷,如模式串为"aaaab"时。自己好好体会吧
更新一下之前写的Excel的数据库类,将其改成函数的形式,调用更简单(省却了生成类实例的步骤)。现在这个代码在工作中用了一年多,已经比较健壮。若有问题,请留言指出或与我联系。
这些代码有如下优势:
•无需任何配置。在VBA中新建模块,并把代码复制转帖过去即可使用。
•有以下函数:执行数据库语句、查询数据库、结果复制到单元格(Excel中最常用)、将Excel表格上传到数据库。基本覆盖Excel中对数据库的常用 *** 作。
•会在立即窗口显示数据库错误信息,方便查错。
•在数据库连接字符串字典中配好数据库连接信息后,数据库访问时可直接使用配好的链接字符串。
具体的函数用法已经写在下面代码注释里。简单描述一下:
•dqQueryToArray(sql, connection_string) 查询数据库,返回一个二维数组
•dbQueryOne(sql, connection_string) 查询数据库,返回单个变量。
•dbQueryToCell(sql, range, connection_string, withHeader) 查询数据库后,将结果显示在range开始的区域中;withHeader控制是否显示列名。
•dbExec(sql, necction_string) 执行数据库语句;无返回值
•dbInsertRange(table, range, connection_string, is_empty) 将本Excel文件的range区域里的数据插入到数据库的表table。其中is_empty控制在上传数据前是否清空table的原数据。
其它就看一下代码吧:
' EXCEL的ADO数据库 *** 作函数库
' 这些代码应该放在Excel的VBA模块中,类模块的名字为database,并以以下形式引用:
'
' res = dbQueryToArry(sql, connection_string)
' ' 返回sql的查询结果,结果为一个二维数组
' res = dbQueryOne(sql, connection_string)
' ' 返回sql的查询结果,但只返回第一个数据(相当于数据库查询结果的左上角那个数据)
' dbQueryToCell sql, save_to_range, connection_string, withHeader
' ' 将sql的查询结果直接写入到以save_to_range开头的单元格区域中
' ' withHeader控制是否复制表头,默认为true(复制表头)
'
' 其中参数sql为数据库查询语句,connection_string为数据库连接字符串。
'
' 比如要连接SQL数据库,并已经设置ODBC,连接字符串为:
' "Provider=MSDASQL;DSN=odbc_name;UID=username;PWD=password;database=database_name;"
' 如果未设置ODBC,连接字符串为:
' "driver={SQL Server};server=service_name_or_ip;uid=username;pwd=password;database=database_name;"
' 其中最后面的database变量可省略。对于SQL Server,推荐使用后一种方法。
'
' 如果数据来源为Excel文件,connection_string参数可省略
'
' 其它功能:内置数据库的连接字符串、查询存储过程
'
' Author: zhang@zhiqiangorg, 2014-03-01 v4
' url: >
ResultSetnext()函数返回值强制转换成String是不对的。
因为ResultSet是table(表格),next()方法是将指针从当前位置下移一行。
如果你要返回String,可以:
ResultSet rs=dbexecuteSQL("select faculty from staff where staff_name='"+uid+"'");
String s=null;
while(rsnext()){
//1表示第一个字段,也可以rsgetString("name"),直接写出字段名。
s=rsgetString(1);
outprintln(s);
}
以上就是关于求出子串(模式串)的next函数值,利用kmp算法实现模式与主串的匹配算法全部的内容,包括:求出子串(模式串)的next函数值,利用kmp算法实现模式与主串的匹配算法、如何更新Excel的数据库查询函数库、ResultSet.next()方法的返回值是否可以被强制转换等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)