28 找出字符串中第一个匹配项的下标
28 找出字符串中第一个匹配项的下标
//28 找出字符串中第一个匹配项的下标
var strStr = function(haystack, needle) {
//KMP算法
if(needle.length == 0) return 0;
let next = getNext(needle); //获取next数组
let i = 0, j = 0;
while(i < haystack.length && j < needle.length) { //i是主串的指针,j是模式串的指针
if(j == -1 || haystack[i] == needle[j]) { //j==-1表示第一个字符就不匹配,haystack[i] == needle[j]表示当前字符匹配成功
i++;
j++;
} else { //当前字符匹配失败,令i不变,j=next[j],j回到合适的位置继续匹配
j = next[j];
}
}
if(j == needle.length) return i - j; //匹配成功,返回主串与模式串第一个匹配的字符的位置
return -1;
};
var getNext = function(needle) { //获取next数组
let next = [-1];
let i = 0, j = -1;
while(i < needle.length - 1) {
if(j == -1 || needle[i] == needle[j]) {
i++;
j++;
next[i] = j;
} else {
j = next[j];
}
}
return next;
}
459 重复的子字符串
459 重复的子字符串
//459 重复的子字符串
var repeatedSubstringPattern = function(s) {
let len = s.length;//字符串长度
for(let i = 1; i <= len / 2; i++) {//子串长度
if(len % i == 0) {//子串长度能被字符串长度整除
let str = s.slice(0, i); //子串
let flag = true; //标志位
for(let j = i; j < len; j += i) {//遍历字符串
if(str != s.slice(j, j + i)) { //子串不相等
flag = false;//标志位置为false
break;
}
}
if(flag) return true;//标志位为true,返回true
}
}
return false;// 遍历完都没有返回true,返回false
};