第9天 第四章 字符串 今日任务 ●28. 实现 strStr() ●459.重复的子字符串 ●字符串总结 ●双指针回顾

文章介绍了如何实现strStr()函数,利用KMP算法进行字符串匹配,以及解决459.重复的子字符串问题。KMP算法的关键在于计算Next数组,虽然初期理解可能有难度,但掌握后能有效处理字符串匹配问题。同时,文章展示了如何反转字符串的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

9 第四章 字符串
今日任务

●28. 实现 strStr()
●459.重复的子字符串
●字符串总结
●双指针回顾

详细布置

  1. 实现 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;
}

非常简单,双指针轻松秒杀。

  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数组求出来。然后通过一个巧妙的判断,就可以得知里面有没有重复的字符串。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Javie Deng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值