代码随想录Day9打卡

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
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值