您的位置:首页 > 编程语言 > Java开发

字符串匹配(java)实现,普通的匹配和KMP算法 (参考)

2015-05-04 21:09 856 查看

普通的字符串匹配:

public static int ViolentMatch(String str, String seed){

int i = 0;

int j = 0;

char[] strtochars = str.toCharArray();

char[] seedtochars = seed.toCharArray();

while (i < str.length() && j < seed.length())

{

if (strtochars[i] == seedtochars[j])

{

//①如果当前字符匹配成功(即S[i] == P[j]),则i++,j++

i++;

j++;

}

else

{

//②如果失配(即S[i]! = P[j]),令i = i - (j - 1),j = 0

i = i - j + 1;

j = 0;

}

}

//匹配成功,返回模式串p在文本串s中的位置,否则返回-1

if (j == seed.length())

return i - j;

else

return -1;

}

KMP算法实现的字符串匹配:

public static int KmpSearch(String s, String p){

int i = 0;

int j = 0;

char[] strtochars = s.toCharArray();

char[] seedtochars = p.toCharArray();

while (i < s.length() && j < p.length())

{

//①如果j = -1,或者当前字符匹配成功(即S[i] == P[j]),都令i++,j++

if (j == -1 || strtochars[i] == seedtochars[j])

{

i++;

j++;

}

else

{

//②如果j != -1,且当前字符匹配失败(即S[i] != P[j]),则令 i 不变,j = next[j]

//next[j]即为j所对应的next值

j = next.get(j);

}

}

if (j == p.length())

return i - j;

else

return -1;

}

得到next数组:

public static void GetNext(String p)

{

next.add(-1);

int k = -1;

int j = 0;

char[] ps = p.toCharArray();

while (j < p.length() - 1)

{

//p[k]表示前缀,p[j]表示后缀

if (k == -1 || ps[j] == ps[k])

{

++k;

++j;

next.add(k);

}

else

{

k = next.get(k);

}

}

}

得到nextvel数组:

public static void GetNextval(String p)

{

next.add(-1);

int k = -1;

int j = 0;

char[] ps = p.toCharArray();

while (j < p.length() - 1)

{

//p[k]表示前缀,p[j]表示后缀

if (k == -1 || ps[j] == ps[k])

{

++j;

++k;

//较之前next数组求法,改动在下面4行

if (ps[j] != ps[k])

next.add(k); //之前只有这一行

else

//因为不能出现p[j] = p[ next[j ]],所以当出现时需要继续递归,k = next[k] = next[next[k]]

next.set(j, next.get(k));

}

else

{

k = next.get(k);

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: