day9 记录代码随想录
第一题 力扣28找出字符串中第一个匹配项的下标(实现strStr())
实现 strStr() 函数。
给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。
示例 1: 输入: haystack = "hello", needle = "ll" 输出: 2
示例 2: 输入: haystack = "aaaaa", needle = "bba" 输出: -1
说明: 当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。 对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与C语言的 strstr() 以及 Java的 indexOf() 定义相符。
题目链接:力扣题目链接
本题是KMP算法的经典题。
主要理解两个基本概念,前缀表和最大相等前后缀。
这个很复杂,看得我蒙蒙的,一刷先不管了,简单过一遍就算了。
代码如下:
class Solution {
public:
void getNext(int *next , string &needle) {
int j = -1; //初始化
next[0] = j;
for(int i = 1; i < needle.size(); i++) { //从i = 1开始循环
while(j >= 0 && needle[i] != needle[j+1]) //前缀与后缀的最后一位不相等情况
j = next[j]; //j回退
if(needle[i] == needle[j+1]) //前后缀相等情况
j++; //最大相等前后缀数加一,同时前缀加一
next[i] = j; //更新一下next值为j(前缀长度)
}
}
int strStr(string haystack, string needle) {
int next[needle.size()];
getNext(next, needle);
int j = -1;//next的初始位置为-1
for(int i = 0; i < haystack.size(); i++) {
while(j >= 0 && haystack[i] != needle[j+1]) // 不相等时j后退
j = next[j];
if(haystack[i] == needle[j+1]) { //相等时j++
j++;
}
if(j == needle.size() - 1) //j比对到n的最后面时说明找到了
return (i - needle.size() + 1);
}
return -1;
}
};
第二题 力扣459.重复的子字符串
给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。
示例 1:
- 输入: "abab"
- 输出: True
- 解释: 可由子字符串 "ab" 重复两次构成。
示例 2:
- 输入: "aba"
- 输出: False
示例 3:
- 输入: "abcabcabcabc"
- 输出: True
- 解释: 可由子字符串 "abc" 重复四次构成。 (或者子字符串 "abcabc" 重复两次构成。)
题目链接:力扣题目链接
本题是KMP算法的应用,同看不懂,也过也过。
代码如下:
class Solution {
public:
void getNext(int *next, string &s) {
int j = -1;
next[0] = j;
for(int i = 1; i < s.size(); i++) {
while(j >= 0 && s[i] != s[j+1])
j = next[j];
if(s[i] == s[j+1])
j++;
next[i] = j;
}
}
bool repeatedSubstringPattern(string s) {
int next[s.size()];
int j = -1;
getNext(next, s);
int len = s.size();
if(next[len - 1] != -1 && len%(len - (next[len - 1] + 1)) == 0)
return true;
return false;
}
};