关注
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
相关推荐
牛客热帖
- 1... 想来字节技术实习,看我这篇就够了!——保姆级面经大放送1.8W
- 2... 毕业1.2W
- 3... 25届第一份实习怎么找?1.1W
- 4... 【0429快问快答】99%牛油的疑惑解答(更新至38个问题1.1W
- 5... 0实习经验上岸字节,分享一下过程经验9433
- 6... 【奖】休息放松or学习提升,五一假期和牛牛一起“充充电”🔋7860
- 7... 准备去参加自己的婚礼6129
- 8... 美团后端日常实习一二面(已oc)5646
- 9... 为什么我不建议你学C++后端5204
- 10... 【薪资计算】SS Is All You Need4716
正在热议
# 牛友的五一计划 #
25174次浏览 456人参与
# 市场营销面经 #
1658次浏览 78人参与
# 牛客帮帮团来啦!有问必答 #
414034次浏览 7973人参与
# 晒一晒我的offer #
2854410次浏览 50156人参与
# 互联网公司评价 #
63535次浏览 904人参与
# 市场营销人求职交流聚集地 #
25449次浏览 577人参与
# 许愿池 #
66999次浏览 1485人参与
# 我的上岸简历长这样 #
142619次浏览 2862人参与
# 提前批真的不会影响正式批吗 #
18179次浏览 229人参与
# 如何看待offer收割机的行为 #
197291次浏览 3025人参与
# 国企和大厂硬件兄弟怎么选? #
28578次浏览 551人参与
# 非技术岗薪资爆料 #
10351次浏览 204人参与
# 找工作,你会甘心进小厂还是猛冲大厂 #
24691次浏览 244人参与
# 产品实习,你更倾向大公司or小公司 #
31521次浏览 494人参与
# 在国企工作的人,躺平了吗? #
74149次浏览 907人参与
# 浅聊一下我实习的辛苦费 #
71477次浏览 648人参与
# 简历中的项目经历要怎么写 #
383534次浏览 6430人参与
# 没有实习经历,还有机会进大厂吗 #
260491次浏览 4908人参与
# 机械制造薪资爆料 #
262750次浏览 3204人参与
# 双非本科求职如何逆袭 #
174645次浏览 2626人参与