✅✅代码随想录算法训练营Day10 || 459.重复的子字符串, 字符串总结 , 双指针回顾

78 阅读3分钟

我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第13篇文章 点击查看文章详情 🚀🚀

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情🚀🚀

前言

今天到了小结一个礼拜成果的时候了。

温故而知新~

⭐⭐⭐

459. 重复的子字符串 - 力扣(LeetCode)

image.png

api解法

var repeatedSubstringPattern = function(s) {
    let len = s.length;
    let step = 1;
    let nums = s.substr(0,step);
    while( step <= len/2){
        if(nums.repeat(len/step) == s){
            return true;
        }
        else{
            step++;
            nums = s.substr(0,step);
        }
    }
    return false
};

思路

利用滑动窗口的思想,如果该窗口中的字符串正好是s字符串的重复子串,那么重复len/step次后,正好会等于s字符串。

详细步骤

开始设置窗口的宽度为step,初始值为1,将该窗口重复len/step次,如果不满足重复后等于s字符串,则将step++,同时更新子字符串nums = s.substr(0.step),不断循环,直到达到边界条件,如果还不满足,则直接返回false。

注意:窗口有一个边界的条件,那就是窗口的最大宽度不会超过字符串的一半。因为字符串是由子字符串组成,重复的次数至少为2。 while(step <= len/2)

字符串总结

反转字符串

  • api解法
// 定义被反转的字符串
const str = 'juejin'
// 定义反转后的字符串 
const res = str.split('').reverse().join('') 
console.log(res) // nijeuj
  • 双指针解法
    while(l < r){
        [s[l],s[r]] = [s[r],s[l]];
        l++;
        r--;
    }

判断回文

  • 直接反转
function isPalindrome(str) { 
// 先反转字符串
const reversedStr = str.split('').reverse().join('') 
// 判断反转前后是否相等 
return reversedStr === str
}
  • 双指针

利用回文的对称属性


function isPalindrome(str) { 
// 缓存字符串的长度 
const len = str.length 
// 遍历前半部分,判断和后半部分是否对称
for(let i=0;i<len/2;i++) { 
    if(str[i]!==str[len-i-1]){ 
    return false
    }
 } 
return true
}

掌握好api

替换空格

image.png api:

    let res = s.split(' ');
    let newS = res.join('%20');
    return newS

正则

     return s.replace(/ /g, "%20");

重复的子字符串

image.png 完整的过程

var repeatedSubstringPattern = function(s) {
    let len = s.length;
    let step = 1;
    let nums = s.substr(0,step);
    while( step <= len/2){
        if(nums.repeat(len/step) == s){
            return true;
        }
        else{
            step++;
            nums = s.substr(0,step);
        }
    }
    return false
};
  1. s.substr(0,step) 截取下标位置为[0,step]的字符串
  2. nums.repeat(len/step) 重复len/step

双指针总结

数组中

数组移除元素

在数组移除元素的题型中:27. 移除元素 - 力扣(LeetCode)

👉👉👉 动态效果图

要移除数组上的元素,不能做到真正的删除,只能进行覆盖。

 let slow = 0;
    let len = nums.length;
    for(let fast = 0;fast < len ;fast++){
        if(nums[fast] != val){
            nums[slow] = nums[fast];
            slow++;
        }
    }
    return slow;

创建快慢指针,快指针先移动,若快指针对应的值不是目标值,就把该值赋值给慢指针。

字符串中

反转字符串

while(l < r){
    [s[l],s[r]] = [s[r],s[l]];
    l++; 
    r--; 
}

双指针,一个指头,一个指尾,每一次让首尾元素进行互换,再让指针向内移动。

链表中

反转链表

image.png 首先要定义cur指向当前头结点,再定义pre指向cur的上一个结点。

var reverseList = function(head) {
    if(!head) return head;
    let cur = head;
    let pre = null;
    while(cur){
        let next = cur.next;
        cur.next = pre;
        pre = cur;
        cur = next;
    }
    return pre;

};

要实现反转的效果,只需要每次cur.next = pre

删除链表倒数第n个结点

这里用到了fastslow快慢指针

如果要删除倒数第n个节点,让fast移动n步,然后让fastslow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了。

N数之和中

三数之和

还是那句话,求和问题,一般情况下都可以转换成差值问题

image.png

像上面这样,固定一个数,然后用双指针移动两个数。

在实现之前不要忘了要对原数组进行排序。

小结

以上就是对这个礼拜刷过的题的一个小结,肯定还有不少是我自己没注意到的,没事,反正以后还会进行二刷,三刷。

😁😁😁