第四章 字符串part02
今日任务
●缺 KMP 算法
●字符串总结
●双指针回顾
字符串总结
概念:什么是字符串,可以将其理解成字符数组,在C++/Java 中被封装成 string 类,
双指针是字符串题目的常用解法,首先从快慢指针到头尾指针的掌握,十分考验代码能力。
以下是以往使用双指针完成字符串的题目
双指针回顾
此时我们已经做过10到双指针的题目了,来一起回顾一下,大家自己也总结一下双指针的心得
- 反转字符串:使用头尾指针,一块向中间元素移动进行逐一反转
- 替换空格: 先将数组扩容到目标结果的容量,然后从后向前的逐一赋值,不可以从前向后,因为这样的时间复杂度为O(n ^ 2)
- 移除元素:使用快慢指针,快指针负责寻找不需要删除的元素,慢指针负责赋值
翻转字符串里的单词:删除冗余空格,进行整体反转,再进行局部反转(逐个单词的反转)
链表相关:
反转链表:逐一的从头指针开始将节点的指向反转。即只需改变链表的next指针的指向,直到链表的反转
环形链表:因为要证明是否是环形链表,可以使用快慢指针,只要两个指针相遇的情况下,则一定是环形链表。有一个非常重要的数学知识点是:当快慢指针相遇时,快指针到入口的距离 = 头指针到入口的距离
几数之和相关:
我们使用哈希法来解决了两数之和,那么三数之和、四数之和呢?使用哈希法解决后两种情况是比较复杂冗余的。建议我们使用双指针的方法来解决。
三数之和:先对数组进行排序,去重,定义 a = 0 ,b = a + 1, c = nums.length - 1; 找到后去重 b , c
四数之和:在三数之和的基础上再套一层 for 循环,a = 0,b = a + 1, c = b + 1, d = nums.length - 1;
总结:一般使用双指针来解决问题的话,可以将时间复杂度 从 O(n ^ 2) 降为 O (n);