9 第四章 字符串
今日任务
●28. 实现 strStr()
●459.重复的子字符串
●字符串总结
●双指针回顾
详细布置
- 实现 strStr() (本题可以跳过)
int strStr(char* haystack, char* needle) {
int haystacklength = strlen(haystack);
int needlelength = strlen(needle);
if (needlelength == 0)
return 0;
int next[needlelength];
next[0] = 0;
for (int i = 1, j = 0; i < needlelength; i++)
{
while (j > 0 && needle[i] != needle[j])
{
j = next[j - 1];
}
if (needle[i] == needle[j])
{
j++;
}
next[i] = j;
}
for (int i = 0, j = 0; i < haystacklength; i++)
{
while (j > 0 && haystack[i] != needle[j])
{
j = next[j - 1];
}
if (haystack[i] == needle[j])
{
j++;
}
if (j == needlelength)
{
return i - needlelength + 1;
}
}
return -1;
}
非常简单,双指针轻松秒杀。
- 反转字符串II
void swap(char* a, char* b)
{
char temp=*a;
* a = *b;
* b = temp;
}
void reverseString(char* s, int sSize) {
int left = 0;
int right = sSize - 1;
for (; left < right;)
{
swap(&s[left++], &s[right--]);
}
}
char* reverseStr(char* s, int k) {
int n = strlen(s);
for (int i = 0; i < n; i+=2*k)
{
int last = n - i;
if (2*k>last>k)
{
reverseString(&s[i], k);
break;
}
if (last<k)
{
reverseString(&s[i], last);
return s;
}
reverseString(&s[i], k);
}
return s;
}
Kmp算法真的太邪魔了。不过我就是来学他的。懂了还真挺有意思的。X数组以及通过kmp算法来匹配字符串用了同样的一个思想。在学习如何求NEX数组的时候,容易把人弄迷糊,但是这个算法关键点就在于把NEX的数组的求法弄清楚。整个匹配机制反而也就明晰了。可以尝试多看几篇,立扣上的体检有他的小伙伴讲的很详细。
459.重复的子字符串 (本题可以跳过)
void swap(char* a, char* b)
{
char temp = *a;
*a = *b;
*b = temp;
}
void reverseString(char* s, int sSize) {
// 344.反转字符串
int left = 0;
int right = sSize - 1;
for (; left < right;)
{
swap(&s[left++], &s[right--]);
}
}
char* reverseLeftWords(char* s, int n) {
int length = strlen(s);
reverseString(s,length);
reverseString(s,length-n);
reverseString(&s[length-n],n);
return s;
}
整道题都非常的巧妙。通过求一个NEX数组求出来。然后通过一个巧妙的判断,就可以得知里面有没有重复的字符串。