1.知识点
KMP算法
2.刷题
28.找出字符串中第一个匹配项的下标
LeetCode链接 28. 找出字符串中第一个匹配项的下标 - 力扣(LeetCode)
题目描述
方法1:暴力枚举
package daimasuixiangshuati.day09_zifuchuan;
/**
* @Author LeiGe
* @Date 2023/10/22
* @Description todo
*/
public class ZhaoChuZiFuChuanZhongDiYiGePiPeiXiangDeXiaBiao28_1 {
/**
* 方法1-双层循环:
* 外层循环-原串的[发起点],
* 内层循环-从原串的[发起点]和匹配串的[首位]开始,尝试匹配
*
* @param haystack
* @param needle
* @return
*/
public static int strStr(String haystack, String needle) {
int hLength = haystack.length();
int nLength = needle.length();
char[] hChars = haystack.toCharArray();
char[] nChars = needle.toCharArray();
//枚举原串的[发起点]
for (int i = 0; i <= (hLength - nLength); i++) {
//从原串的[发起点]和匹配串的[首位]开始,尝试匹配
int a = i, b = 0;
while (b < nLength && hChars[a] == nChars[b]) {
a++;
b++;
}
//如果能够完全匹配,返回原串的[发起点]
if (b == nLength) {
return i;
}
}
return -1;
}
}
时间复杂度:O(N^2)
空间复杂度:O(1)
方法2:KMP算法
459.重复的子字符串
LeetCode链接 459. 重复的子字符串 - 力扣(LeetCode)
题目描述
方法1:
3.小结
字符串系列
字符串系列可以分为3类问题
1.双指针
字符串的翻转可以通过首尾双指针实现,另外像数组填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。
2.翻转
一些难以通过直接翻转得到结果的题目,可以尝试多次翻转,例如:先翻转整体,再翻转局部,先翻转前一部分,后翻转后部分等思路.
3.KMP算法
双指针系列
1.数组
数组中删除一个元素
2.字符串
替换字符串中的空格
花式反转字符串
3.链表
反转链表
链表寻找环入口:快慢指针
4.N数之和
三数之和,四数之和