题目速览
附有leetcode的链接
344. 反转字符串
541. 反转字符串II
剑指 Offer 05.替换空格
151. 翻转字符串里的单词
剑指Offer58-II.左旋转字符串
28.实现 strStr()
459. 重复的子字符串
859. 亲密字符串
748. 最短补全词
分题讲解
344反转字符串
如果题目关键的部分直接用库函数就可以解决,建议不要使用库函数
如果库函数仅仅是 解题过程中的一小部分,并且你已经很清楚这个库函数的内部实现原理的话,可以考虑使用库函数。
1 | java复制代码 public void reverseString(char[] s) { |
541反转字符串ii
1 | java复制代码class Solution { |
谋而后定
先分块
- 够2k
交换函数 - 不够2k
小于k—交换函数
大于k,小于2k—交换函数
剑指Offer5替换空格
1 | java复制代码class Solution { |
这里提供另一种思路:
1.可以扩充原始字符串空间变成可以装下新变化的字符。
2.定位原始字符串的最后一个字符
3.定位新字符串最后一个字符
4.对比复制
1 | java复制代码public String replaceSpace(String s) { |
151. 翻转字符串里的单词
法一:比较水,利用字符串中split函数,额外O(N)空间,最后串起来,要注意,去掉最后的空格,以及存在连续的分割符的时候例如两个空格,分割之后就是“”,用.equals()判断
法二:反转全部的字符,最后在反转其中的单词,这个最后的时间复杂度是O(1)。分步骤执行,最开始要除去多余的空格。反转全部字符串。反转其中的单词。
1 | java复制代码 //法一 |
1 | java复制代码//法二 |
剑指Offer58-II.左旋转字符串
法一:比较水,就是利用substring
其实使用substr 和 反转 时间复杂度是一样的 ,都是O(n),但是使用substr申请了额外空间,所以空间复杂度是O(n),而反转方法的空间复杂度是O(1)。
法二:不使用substring可以直接利用反转来,一个比较有意思的思路就是:
1 | java复制代码//法一: |
28. 实现 strStr()
暴力解法必定是不行的,这里有一个好的api,就是KMP算法,很重要,建议背住
KMP算法
1 | java复制代码 public static int strStr(String haystack, String needle) { |
29. 重复的子字符串
自己一上来还真的是不知道要用KMP算法,但是因为是要看是不是重复的组成字符串,那么next[]的数组绝对是有规律的。可以运行几个next[]数组看看可以得到如下的规律:
1 | java复制代码public static boolean repeatedSubstringPattern(String s) { |
859. 亲密字符串
思路:
自己第一次只想到了遍历,知道这是必定错误的做法。
现在看来,可以想想,满足什么条件,就可以充分的得出结果,不需要模拟遍历
满足亲密字符串的条件:
- str1 和 str2的长度、词频必然相同
- 对于每一个i位置,只能有两个词不同 || 当没有不同词的时候,重复的词大于1
代码:
1 | java复制代码 public static boolean buddyStrings(String s, String goal) { |
748. 最短补全词
思路:
自己第一次想到了如下的步骤:
- lisense字频统计
- 遍历words中的每一个word,然后字符统计
- 比较(并记录最小符合条件的word长度)
但是在3中,自己为了追求空间复杂度,想着复用一个int[26],在这个基础上加加减减,但是显得代码很乱。还不如每次新建一个每次刷新,也是用的一个int[26],所以代码看的清楚也很重要
代码:
注意:
Character.isLetter(licensePlate.charAt(i)) 判断字符是不是字母
Character.toLowerCase(licensePlate.charAt(i)) 将可能的大写字母转为小写字母
1 | java复制代码class Solution { |
总结
- 建议如果题目关键的部分直接用库函数就可以解决,建议不要使用库函数。如果库函数仅仅是 解题过程中的一小部分,并且你已经很清楚这个库函数的内部实现原理的话,可以考虑使用库函数。
- 双指针法在数组,链表和字符串中很常用。很多数组填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作
- 当需要固定规律一段一段去处理字符串的时候,要想想在在for循环的表达式上做做文章,有一个思路:先整体反转再局部反转、先局部反转再整体反转
- KMP的主要思想是当出现字符串不匹配时,可以知道一部分之前已经匹配的文本内容,可以利用这些信息避免从头再去做匹配了。—-字符串中最重要的算法
本文转载自: 掘金