【LeetCode Hot100】双指针:分离指针

前言

本章学习目的:掌握两个指针分别遍历不同序列解法。这个解法通常用于两个序列之间做匹配,合并,插入,交换。

88:合并两个有序数组

题目要求:

给你两个有序数组,要求把两个数组合并到其中一个数组,并且还是有序

核心思路

我们定义三个指针:

i → nums1 有效部分末尾(m-1)

j → nums2 末尾(n-1)

k → nums1 最后位置(m+n-1)

因为nums1的末尾都是0,所以我们从末尾添加数字

代码实现

java 复制代码
int i=m-1;
int j=n-1;
int k=m+n-1;

while(i>=0&&j>=0){
if(num1[i]>nums2[j]){
nums1[k]=nums1[i];
i--
}else{
nums1[k]=nums2[j];
j--;
}
k--;
while(j>=0){
nums1[k]=nums2[j];
j--;
k--;
}

总结

双指针分别从后向前遍历两个数组。

28:找出字符串中第一个匹配项的下标

题目要求:在 haystack 里找 needle 第一次出现的位置,字符串匹配问题

核心思路

定义两个指针:

i → 指向 haystack(主串)

j → 指向 needle(子串)

流程:

  1. i 从 0 开始遍历主串
  2. j 从 0 开始匹配子串
  3. 如果字符相等 → i++, j++
  4. 如果不等 → 回退 i,j 归0

代码实现

java 复制代码
class Solution {
    public int strStr(String haystack, String needle) {

        if (needle.length() == 0) return 0;

        int i = 0; // 主串指针
        int j = 0; // 子串指针

        while (i < haystack.length()) {

            if (haystack.charAt(i) == needle.charAt(j)) {
                i++;
                j++;
                
                // 完全匹配
                if (j == needle.length()) {
                    return i - j;
                }

            } else {
                // 回退:关键🔥
                i = i - j + 1;
                j = 0;
            }
        }

        return -1;
    }
}

总结

用双指针分别遍历两个字符串,通过比较字符是否相等来完成解答

1768:交替合并字符串

题目要求:

给你两个字符串

word1 = "abc"

word2 = "pqr"

要求:交替合并 → apbqcr

核心思想

两个指针各走各的,轮流取字符

代码实现

java 复制代码
int i=0;
int j=0;
StringBuilder res=new StringBuilder();
while(i<word1.length.length()||i<word2.length()){
if(i<word1.length()){
res.append(word1.charAt(i));
i++;
}else{
if(j<word2.length()){
res.append(word2.charAt(j));
j++;
}
}
return res.toString();

总结

掌握字符串于数组之间转换的语法

StringBuilder可变字符串类型

添加append(charAt)

392:判断子序列

题目要求:

给定字符串 s 和 t ,判断 s 是否为 t 的子序列。

代码实现

java 复制代码
class Solution {
    public boolean isSubsequence(String s, String t) {
        int i=0;
        int j=0;
        if(s.length()>t.length())return false;
        //前置条件      
        while(i<s.length()&&j<t.length()){
          if(t.charAt(j)==s.charAt(i)){
            i++;
          }
            j++;
        }
       return i==s.length();
    }
}

总结

本章学习的是双指针:分离指针

一般都是定义多个指针,每一个指针遍历多个数组,进行判断或者拼接。

相关推荐
稚南城才子,乌衣巷风流2 小时前
ST 表(Sparse Table)算法详解:原理、实现与应用
算法
hold?fish:palm2 小时前
9 找到字符串中所有字母异位词
c++·算法·leetcode
Sw1zzle2 小时前
算法入门(六):贪心算法 - 基础入门(Leetcode 121/455/860/376/738)
算法·leetcode·贪心算法
青山木3 小时前
Hot 100 --- 岛屿数量
java·数据结构·算法·leetcode·深度优先·广度优先
不会就选b3 小时前
算法日常・每日刷题--<归并排序>1
数据结构·算法
危桥带雨3 小时前
排序算法(快排、归并、计数、基数排序)
数据结构·算法·排序算法
啦啦啦啦啦zzzz3 小时前
算法:回溯算法
c++·算法·leetcode
IT探索3 小时前
Linux 查找文件指令总结
linux·算法
攻城狮Soar3 小时前
C++子类访问父类成员
c++·算法