28.找出字符串中第一个匹配项的下标
题目:28.找出字符串中第一个匹配项的下标
文档讲解:代码随想录-28.找出字符串中第一个匹配项的下标
视频讲解:哔哩哔哩-28.找出字符串中第一个匹配项的下标
状态/时间:没写出来/三十分钟
思路:
这道题其实就是用到了KMP算法。
代码:
class Solution {
//前缀表 不减一
public int strStr(String haystack, String needle) {
if (needle.length() == 0) return 0;
int[] next = new int[needle.length()];
getNext(next, needle);
int j = 0;
for (int i = 0; i < haystack.length(); i++) {
while (j > 0 && needle.charAt(j) != haystack.charAt(i))
j = next[j - 1];
if (needle.charAt(j) == haystack.charAt(i))
j++;
if (j == needle.length())
return i - needle.length() + 1;
}
return -1;
}
private void getNext(int[] next, String s) {
int j = 0;
next[0] = 0;
for (int i = 1; i < s.length(); i++) {
while (j > 0 && s.charAt(j) != s.charAt(i))
j = next[j - 1];
if (s.charAt(j) == s.charAt(i))
j++;
next[i] = j;
}
}
}
注意:
459.重复的子字符串
题目:459.重复的子字符串
文档讲解:代码随想录-459.重复的子字符串
视频讲解:哔哩哔哩-459.重复的子字符串
状态/时间:没写出来/三十分钟
思路:
这道题能够暴力解,就是一个for循环获取 子串的终止位置, 然后判断子串是否能重复构成字符串,又嵌套一个for循环。
还有就是KMP方法进行匹配。
代码:
class Solution {
public boolean repeatedSubstringPattern(String s) {
if (s.equals("")){
return false;
}
int len = s.length();
s = " " + s;
char[] chars = s.toCharArray();
int[] next = new int[len + 1];
for (int i = 2, j = 0; i <= len; i++) {
while (j > 0 && chars[i] != chars[j + 1]) j = next[j];
if (chars[i] == chars[j + 1]) j++;
next[i] = j;
}
// 判断是否是重复的子字符
if (next[len] > 0 && len % (len - next[len]) == 0) {
return true;
}
return false;
}
}
注意:
还复习了下双指针的题目,挺多还是写不出来的,代码就不贴出来啦。