文章目录
- 前言
- 一、找出字符串中第一个匹配项的下标(力扣28)
- 二、重复的子字符串(力扣459)
前言
1、找出字符串中第一个匹配项的下标
2、重复的子字符串
一、找出字符串中第一个匹配项的下标(力扣28)
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。
字符串匹配----KMP算法
class Solution {
public int strStr(String haystack, String needle) {
char[] haystack1 = haystack.toCharArray();
char[] needle1 = needle.toCharArray();
int[] next = new int[needle.length()];
int i=0;
int j=0;
int res = -1;
//求next数组
getNext(next,needle);
//KMP算法
for(i=0;i<haystack1.length;i++){
while(haystack1[i]!=needle1[j] && j>0){
j=next[j-1];
}
if(haystack1[i]==needle1[j]){
j++;
}
if(j==needle1.length){
return (i-needle1.length+1);
}
}
return -1;
}
public void getNext(int[] next,String needle){
char[] chars = needle.toCharArray();
//初始化next数组
int i;//i指向后缀末尾位置
int j=0;//j是指向前缀末尾位置
next[0]=0;
for(i=1;i<chars.length;i++){
//处理前后缀不相同的情况
while(j>0 && chars[i]!=chars[j]){
j=next[j-1];
}
//处理前后缀相同的情况
if(chars[i]==chars[j]){
j++;
}
//更新next数组的值
next[i]=j;
}
}
}
二、重复的子字符串(力扣459)
给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。
思路:
假设字符串s是由s1+s2组成的,s+s后,str就变成了s1+s2+s1+s2,去掉首尾,破环了首尾的s1和s2,变成了s3+s2+s1+s4,此时str中间就是s2+s1,如果s是循环字串,也就是s1=s2,所以str中间的s2+s1就和原字符串相等。如果s不是循环字串,s1!=s2,那么s1+s2是不等于s2+s1的,也就是str中间不包含s
class Solution {
public boolean repeatedSubstringPattern(String s) {
String str = s + s;
return str.substring(1, str.length() - 1).contains(s);
}
}
链接: link