字符串总结

541. 反转字符串 II

反转每个下标从 2k 的倍数开始的,长度为 k 的子串。若该子串长度不足 k,则反转整个子串

        for(int i = 0; i < len; i = i + 2 * k){
            //反转:【2k倍数下标,2k倍数下标+k】
            if(i + k <= len){
                reversechar(ch, i, i+k - 1);
            }
            //反转:剩余全部字符
            if(i + k > len){
                reversechar(ch, i, len - 1);
            }
            
        }

28. 找出字符串中第一个匹配项的下标

KMP算法模板

在s中匹配t
在这里插入图片描述

class Solution {
    public int strStr(String s, String t) {
       int[] next = new int[t.length() + 1];
        
        //求next数组: next[j]代表t[0:j-1]的最长公共前后缀长度
        //next[0] = next[1] = 0, 所以从next[2]开始求
       for(int j = 2,i=0; j < next.length; j++){
           //上图所示 ① = ② , 若t[j-1] == t.[i],最长前缀的长度 = next[j-1] + 1 = i + 1
           //若是不相等就得继续向前找,即不停更新i的值
            while(i > 0 && t[j-1] != t.[i]) 
                i = next[i];
           //不能直接用next[j] = i + 1代替,因为当i = 0时跳出循环,next[j] = 0
           //即若t[j-1] == t[i],next[j] = i + 1
           //否则next[j] = i
            if(t[j-1] == t[i]) 
                i++;
            next[j] = i;
       }
        
       //匹配阶段
       for(int i = 0, j = 0; i < s.length(); i++){
           //不匹配,j直接跳转到next[j]
            while(j > 0 && s[i] != t[j]) j = next[j];
           //匹配,j就前进一步
            if(s[i] == t[j]) j++;
           //j走到头了,返回当前i指针的位置 往前面走j步 的位置
            if(j == t.length()){
                return i - t.length() + 1;
            }
       }
        return -1;
    }
}

459. 重复的子字符串

假设有这样一个字符串s,

它是由n个s’组成的 那肯定 s = s’s’s’s’s’s’s’s’s’s’s’…s’s’s’s’s’s’s’s’

现在由两个指针指向每个子串的开头

img

两个指针同时向后移动,永远是相等的

img

所以只要找到一个间距,使得两个指针向后移动时一直相等,那么就存在答案。

解题过程:

首先将两指针的距离设置为1,即count = 1

如果指针相等,则统一后移一位

如果不相等,left指针回到初始位置,两指针距离加一

距离为1时,不相等,需要增加距离

img

距离为2时,不相等,需要增加距离

img

距离为3时,不相等,需要增加距离

img

距离为4时,相等,同时向后移动

img

img

img

img

如果字符串符合题意:

​ 1、最后一次比较是相等的

​ 2、字符串的总长肯定可以被count 整除

假如字符串总长度为10;count为4,代表子串长度为4;不存在正整数n,使得4*n = 10,不符合题意

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

益生李佳菌

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

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

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

打赏作者

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

抵扣说明:

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

余额充值