28. 实现 strStr()
思路:KMP 算法解决字符串匹配问题:前缀表和next数组
class Solution {
public int strStr(String haystack, String needle) {
if(needle.length()==0){
return 0; // 如果needle为空字符串,则返回0
}
int[] next = new int[needle.length()];
getNext(next,needle); // 获取next数组
int j=-1;
for(int i=0;i<haystack.length();i++){
while(j>=0&&haystack.charAt(i)!=needle.charAt(j+1)){
j=next[j]; // 根据next数组更新j的值
}
if(haystack.charAt(i)==needle.charAt(j+1)){
j++; // 如果匹配成功,j加1
}
if(j==needle.length()-1){
return (i-needle.length()+1); // 如果j等于needle的长度-1,表示匹配成功,返回起始位置
}
}
return -1; // 如果遍历完haystack仍未找到匹配的子串,返回-1
}
public void getNext(int[] next,String s){
int j=-1;
next[0]=j; // 初始化next数组
for(int i=1;i<s.length();i++){
while(j>=0&&s.charAt(i)!=s.charAt(j+1)){
j=next[j]; // 根据next数组更新j的值
}
if(s.charAt(i)==s.charAt(j+1)){
j++; // 如果匹配成功,j加1
}
next[i]=j; // 更新next数组的值
}
}
}
459.重复的子字符串(本题可以跳过)
注意空字符是“ ”,不是“”
class Solution {
public boolean repeatedSubstringPattern(String s) {
if (s.equals("")) // 如果输入字符串为空,则返回 false
return false;
int len = s.length(); // 获取字符串的长度
s = " " + s; // 在原始字符串前面添加一个空格,使得下标从1开始
char[] chars = s.toCharArray(); // 将字符串转换为字符数组
int[] next = new int[len + 1]; // 创建 next 数组,长度为 len + 1
for (int i = 2, j = 0; i <= len; i++) { // 开始构造 next 数组,i 从 2 开始
while (j > 0 && chars[i] != chars[j + 1]) // 使用 KMP 算法构造 next 数组
j = next[j];
if (chars[i] == chars[j + 1]) // 如果匹配成功,j 往后移
j++;
next[i] = j; // 更新 next 数组的值
}
if (next[len] > 0 && len % (len - next[len]) == 0) { // 判断是否是重复的子字符串
return true; // 如果是,则返回 true
}
return false; // 否则返回 false
}
}
符串总结
文章讲解
字符串是若干字符组成的有限序列,也可以理解为是一个字符数组,但是很多语言对字符串做了特殊的规定
双指针回顾
文章讲解
通过两个指针在一个for循环下完成两个for循环的工作
有时字符串可以和双指针配合使用
都需要再看