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’
现在由两个指针指向每个子串的开头
两个指针同时向后移动,永远是相等的
所以只要找到一个间距,使得两个指针向后移动时一直相等,那么就存在答案。
解题过程:
首先将两指针的距离设置为1,即count = 1
如果指针相等,则统一后移一位
如果不相等,left指针回到初始位置,两指针距离加一
距离为1时,不相等,需要增加距离
距离为2时,不相等,需要增加距离
距离为3时,不相等,需要增加距离
距离为4时,相等,同时向后移动
如果字符串符合题意:
1、最后一次比较是相等的
2、字符串的总长肯定可以被count 整除
假如字符串总长度为10;count为4,代表子串长度为4;不存在正整数n,使得4*n = 10,不符合题意