关注
KMP算法
【题目】
给定两个字符串str和match,长度分别为N和M。实现一个算法,如果字符串str中含有字串match,则返回match在str中的开始位置,不含有则返回-1。
【举例】
str=“acbc”,match=“bc”。返回2。
str=“acbc”,match=“bcc”。返回-1。
【要求】
如果match的长度大于str长度(M>N),str必然不会含有match,可直接返回-1。但如果N>=M,要求算法复杂度O(N)。
public int getIndexOf(String
s, String m) {
if (s == null || m ==
null || m.length() < 1 || s.length() < m.length()) {
return -1;
}
char[] ss = s.toCharArray();
char[] ms = m.toCharArray();
int si = 0;
int mi = 0;
int[] next = getNextArray(ms);
while (si < ss.length
&& mi < ms.length) {
if (ss[si] == ms[mi]) {
si++;
mi++;
} else if (next[mi] ==
-1) {
si++;
} else {
mi = next[mi];
}
}
return mi == ms.length ?
si - mi : -1;
}
public int[]
getNextArray(char[] ms) {
if (ms.length == 1) {
return new int[] { -1 };
}
int[] next = new int[ms.length];
next[0] = -1;
next[1] = 0;
int pos = 2;
int cn = 0;
while (pos <
next.length) {
if (ms[pos - 1] ==
ms[cn]) {
next[pos++] = ++cn;
} else if (cn > 0) {
cn = next[cn];
} else {
next[pos++] = 0;
}
}
return next;
}
查看原帖
点赞 7
相关推荐
牛客热帖
更多
正在热议
更多
# 在大厂上班是一种什么样的体验 #
11053次浏览 138人参与
# 你的mentor是什么样的人? #
50841次浏览 714人参与
# 程序员找工作至少要刷多少题? #
19089次浏览 249人参与
# 机械人避雷的岗位/公司 #
43589次浏览 300人参与
# 我现在比当时_,你想录用我吗 #
8840次浏览 111人参与
# 设计人如何选offer #
189499次浏览 868人参与
# 为了减少AI幻觉,你注入过哪些设定? #
4860次浏览 151人参与
# 你的秋招进行到哪一步了 #
2529864次浏览 23253人参与
# 机械人还在等华为开奖吗? #
311974次浏览 1582人参与
# 牛客AI体验站 #
6961次浏览 189人参与
# 重来一次,我还会选择这个专业吗 #
411058次浏览 3898人参与
# 12306一秒售罄,你抢到回家的票了吗? #
2024次浏览 48人参与
# 论秋招对个人心气的改变 #
11346次浏览 156人参与
# 一张图晒一下你的AI员工 #
5210次浏览 117人参与
# AI Coding的使用心得 #
4762次浏览 101人参与
# 我和mentor的爱恨情仇 #
105993次浏览 941人参与
# 刚入职的你踩过哪些坑 #
6989次浏览 128人参与
# 关于春招/暑期实习,你想知道哪些信息? #
7678次浏览 120人参与
# 应届生进小公司有什么影响吗 #
118334次浏览 1159人参与
# 晒晒你司的新年福利 #
8594次浏览 106人参与

