前言
本章学习目的:掌握两个指针分别遍历不同序列解法。这个解法通常用于两个序列之间做匹配,合并,插入,交换。
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(子串)
流程:
- i 从 0 开始遍历主串
- j 从 0 开始匹配子串
- 如果字符相等 → i++, j++
- 如果不等 → 回退 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();
}
}
总结
本章学习的是双指针:分离指针
一般都是定义多个指针,每一个指针遍历多个数组,进行判断或者拼接。