呵呵,楼主多看看数据结构和算法的书吧,KMP算法和BM算法的效率可是很高的。至少不是一个字符一个字符进行比较啊。减少了匹配中回溯的时间花费,你说好不好?
解决方案 »
- 求指点关于tostring()问题
- java删除zip文件
- JNA调用dll的问题
- JAVA子类对象如何调用父类被overridden的函数?
- 多线程怎么实时控制,比如说叫你运行立刻获得cup的使用,而不是进入就绪
- 【Swing】如何刷新Jpanel
- 那位懂enum的高手能把c#中的定义转化java,0,1,2需要表现出来
- 请问,怎么样才能做到不准出现阿拉伯数字
- 一个不可达的错误!编译器无法解析!
- java中的打印预览
- 在java中保存文件时(windows),如果文件名非法,会抛出异常,不知道如何判断文件名非法
- 把JDesktopPane加到JScrollPane里时,把JDesktopPane拉小点.怎么不显示滚动条啊
利用出错函数保存搜索结果,然后匹配就不需要完全回朔了
楼主先研究一下吧
23号kmp弄得我头痛.使用这算法,还得先将 String类转化为 char[] 类
这句话怎么说?String类,就是用char[]保存的,不需要转换.你这是从src.zip中String.java里摘的吧,
看看类开始的时候:
/** The value is used for character storage. */
private char value[];
学习ing
在java中 String类 应该和 char[]类 不同吧!难道同C/C++中的一样?那如果有个这样的方法 void charToString( char[] a, char[] b);
那么我是不是就可以这样使用呢?如下:
String str = new String("new");
char[] chA = new char[7];
charToString( chA, str);我试过,不能通过,而且就算 charToString( chA, (char [])str); 也通不过。我想在java中 String类不会和char[] 数组一样。
public final class String
implements java.io.Serializable, Comparable, CharSequence
{
/** The value is used for character storage. */
private char value[];//我是说,String类,就是用char[]保存的
......
//看见了吗?你贴的代码就是java.lang.String源码,这个是String的方法,可以直接用private char value[]的,完全不需要转换.
static int indexOf(char[] source, int sourceOffset, int sourceCount,
char[] target, int targetOffset, int targetCount,
int fromIndex) {
if (fromIndex >= sourceCount) {
return (targetCount == 0 ? sourceCount : -1);
}
if (fromIndex < 0) {
fromIndex = 0;
}
if (targetCount == 0) {
return fromIndex;
}
.......
class String{
public:
String(const char* init);
~String() {
delete []ch;
}
int fastFind(String pat) const;
private:
int curLen;
char* ch;
int* f;
void fail();
};String::String(const char* init){
ch=new char[maxLen+1];
f=new int[curLen];
if(!ch){
cerr<<"Allocation Error\n";
exit(1);
}
curLen=strlen(init);
strcpy(ch,init);
ch[curLen]='\0';
fail();
}void String::fail(){
int lengthP=curLen;
f=new int[lengthP];
if(!f){
cerr<<"Allocation Error\n";
exit(1);
}
f[0]=-1;
for(int j=1;j<lengthP;j++){
int i=f[j-1];
while(*(ch+j)!=*(ch+i+1)&&i>=0)
i=f[i];
if(*(ch+j)==*(ch+i+1))
f[j]=i+1;
else
f[j]=-1;
}
}int String::fastFind(String pat) const {
int posP=0,posT=0;
int lengthP=pat.curLen,lengthT=curLen;
while(posP<lengthP&&posT<lengthT)
if(pat,ch[posP]==ch[posT])
posT++,posT++;
else
if(posP==0) posT++;
else posP=pat.f[posP-1]+1;
if(posP<lengthP) return -1;
else return posT-lengthP;
}new String时必须调用fail,生成失效函数int* f指向的数组.
fastFind利用失效函数,查找
String str = "string";
char[] des = new char[7];
str.getChars( 0, 6, des, 0);
public class SuiteString
{
/*
function: to get char next[] for kmp
sub: the sub string;
next: the next[] will to get;
*/
private static void getNext( char[] sub, int[] next)
{
int i, j;
i = 1; j = 0;
next[1] = 0;
while ( i < sub[0] )
{
if ( j == 0 || sub[i] == sub[j] )
{
++i; ++j;
next[i] = j;
}
else j = next[j];
}
return;
}
/*
function: kmp function
str: the main string;
substr: the sub string;
index: from str[index];
*/
public static int indexOf( String str, String substr, int index)
{
/*********这里一大堆是初始化和判断**********/
char s[], sub[];
int[] next;
int i = index, j = 0;
int s_len, sub_len;
if ( str == substr )
return 1;
else if ( str == null || substr == null )
return 0;
s_len = str.length();
s = new char[ s_len+1 ];
str.getChars(0, s_len, s, 1);
s[0] = (char)s_len;
sub_len = substr.length();
sub = new char[ sub_len+1 ];
substr.getChars(0, sub_len, sub, 1);
sub[0] = (char)sub_len;
if ( s[0] == 0 || sub[0] == 0)
return 0;
else if ( index < 0 || index > s[0]-sub[0])
return 0;
/*********前期工作完毕**********/ next = new int[ sub[0] + 1 ];
getNext( sub, next); // 得到next数组,后面要用到
while ( i <= s[0] && j <= sub[0] )
{
if ( j == 0 || s[i] == sub[j])
{
++i; ++j;
}
else j = next[j];
}
if ( j > sub[0] )
return i - sub[0];
return 0;
}}