LeetCode 28. 实现 strStr()

牢记一点:next[i] 元素表示【0,i】子串的最长相等前后缀个数,也是模式串与主串匹配不相等时模式串的下一个比较索引

分析1.0

前缀是指不包含最后一个字符的所有以第一个字符开头的连续子串

后缀是指不包含第一个字符的所有以最后一个字符结尾的连续子串

明确主串、模式串,当模式串与主串不一致时,模式串指针移动,可以移动到模式串第一个元素 或 非第一个元素

进而要搞懂最长相等前后缀,当指向j时,模式串[0,j]的最长相等前后缀是多少,如果是3,那next[j]=3,3是最长相等前后缀个数,而3正好是模式串下一个要比较元素的索引,而next数组从索引0开始计算,0 1 2三个索引对应最长相等前后缀,于是要比较的刚好就是第3个,很玄乎但就是这样。

可以看出模式串与前缀表对应位置的数字表示的就是:下标j之前(包括j)的字符串中,有多大长度的相同前缀后缀

j为遍历指针,只能++; i是最长相等前缀的最后一个元素的索引,可向前移动 | 比较过程可以说是模式串自己比自己

class Solution {
public int strStr(String haystack, String needle) {
int i = 0, j = 0;
int[] next = getNext(needle);
while(i < haystack.length() && j < needle.length()){
if(haystack.charAt(i) == needle.charAt(j)){
i++;
j++;
}else{
// 比到模式串第一个还不等 那只能为0了
if (j == 0 && next[j] == 0){
i++;
continue;
}
// 这是关键
j = next[j-1];
}
}
int pos = i - needle.length();
//System.out.println(pos);
return j == needle.length() ? pos : -1;
} int[] getNext(String s){
int len = s.length();
int[] next = new int[len];
// 一个元素没有前缀
next[0] = 0;
// i指向前缀末尾 j遍历模式串,遍历时计算next[j] 表示在模式串、主串比较过程中,如果不匹配,j应该怎么移动
int i = 0, j = 1;
while(j < len){
if(s.charAt(j) == s.charAt(i)){
// 相等 意味着最长相等前后缀又多了一个 而此时最长相等前后缀有i个 赋值后 i j都要后移一位
next[j++] = i++ + 1; // ++i也可
}else{
// 不等了,应该向前移动i指针,找到可能和j指针相等的那个元素
// 如果i移动到了第一个元素还不相等
if (i == 0 && next[i] == 0) {
next[j++] = 0;
continue;
}
// 求前i-1个元素的最长相等前后缀个数,个数正好就是下一个i的索引 玄乎
i = next[i-1];
}
}
// System.out.println(Arrays.toString(next));
return next;
}
}

最新文章

  1. JavaScript随笔8
  2. 用R做逻辑回归之汽车贷款违约模型
  3. 恶心的content
  4. CSS line-height与vertical-align:baseline
  5. Python成长笔记 - 基础篇 (十一)----RabbitMQ、Redis 、线程queue
  6. ytu 2011: C语言实验——找中间数(水题)
  7. online ddl 工具之pt-online-schema-change
  8. 关于bootstrap的datepicker在meteor应用中的使用(不包含bootstrap框架)
  9. Primary Expression
  10. 使用BOOST.SPIRIT.X3的RULE和ACTION进行复杂的语法制导过程
  11. Boost库学习之旅入门篇
  12. HTML5新标签
  13. jfinal常见问题
  14. gradlew在Travis CI没可执行权限 permission denied
  15. 【状态表示】Bzoj1096 [SCOI2008] 着色方案
  16. Java学习笔记(3)
  17. angular cli全局版本大于本地版本 把本地版本升级方式
  18. 随机数类Random
  19. 奶牛易物-Alpha版本测试报告
  20. redis 安装及安装遇到的问题解决

热门文章

  1. 【大数据-课程】高途-天翼云侯圣文-Day1:互联网大数据揭秘(大数据介绍&amp;MR实现双十一举牌)
  2. 【大数据面试】【框架】Zookeeper作用、半数机制、命令、安装台数
  3. include指令和include动作的区别
  4. 配置 DosBox
  5. 关于解决pip安装python第三方库超时的问题
  6. Qt自带的阴影类、跨线程问题汇总、hover相关、全屏轮子,一些思考。
  7. 几种数据库jar包获取方式
  8. 中国风?古典系?AI中文绘图创作尝鲜!⛵
  9. vue 单独封装分页组件
  10. 第一章 --------------------WPF基础概述