【算法方法总结·四】字符串操作的一些技巧和注意事项
- 【算法方法总结·一】二分法的一些技巧和注意事项
- 【算法方法总结·二】双指针的一些技巧和注意事项
- 【算法方法总结·三】滑动窗口的一些技巧和注意事项
- 【算法方法总结·四】字符串操作的一些技巧和注意事项 🎯
- 【算法方法总结·五】链表操作的一些技巧和注意事项
- 【算法方法总结·六】栈队列堆的一些技巧和注意事项
【字符串操作】
此章节涉及到以下 3 个问题
API
关于 String
的一些常用用法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| String str = "abca";
int len = str.length();
char[] ss = str.toCharArray(); for (char c : str.toCharArray()){ System.out.print(c + " "); }
String s = String.valueOf(ss);
boolean isEqual1 = str.equals("abcA");
boolean isEqual2 = str.equalsIgnoreCase("AbcA");
int idx1 = str.indexOf('a');
int idx2 = str.lastIndexOf('a');
String substr1 = str.substring(2);
String substr2 = str.substring(1,3);
String upper = str.toUpperCase();
String lower = str.toLowerCase();
String newStr = str.concat("123");
String replaced = str.replace('a','z');
String splitStr = "a,b,c"; String[] parts = splitStr.split(",");
str.compareTo()
str.format()
str.trim()
|
自定义方法
很多地方会 要求不能 使用 Java
的 API
函数,所以有些方法得会 自己写
例如 151.反转字符串中的单词
1.移除多余空格(首尾空格)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| private StringBuilder reverseSpace(String s) { int start = 0; int end = s.length() - 1; while (s.charAt(start) == ' ') start++; while (s.charAt(end) == ' ') end--; StringBuilder sb = new StringBuilder(); while (start <= end) { char c = s.charAt(start); if (c != ' ' || sb.charAt(sb.length() - 1) != ' ') { sb.append(c); } start++; } return sb; }
|
2.将整个字符串反转
1 2 3 4 5 6 7 8 9 10
| public void reverseString(StringBuilder sb, int start, int end) { while (start < end) { char t = sb.charAt(start); sb.setCharAt(start, sb.charAt(end)); sb.setCharAt(end, t); start++; end--; } }
|
3.将每个单词反转
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| private void reverseEachWord(StringBuilder sb) { int start = 0; int end = 1; int n = sb.length(); while (start < n) { while (end < n && sb.charAt(end) != ' ') { end++; } reverseString(sb, start, end - 1); start = end + 1; end = start + 1; } }
|
字符串匹配
KMP 算法
当出现 字符串不匹配 时,可以知道一部分 之前已经匹配 的文本内容,可以利用这些信息避免从头再去 做匹配了
next 数组 就是一个前缀表,记录下标i
之前(包括i
)的字符串中,有多大长度的相同前缀后缀
前缀表 是用来 回退 的,它记录了 模式串 与 主串(文本串) 不匹配的时候,模式串应该从哪里开始重新匹配
最长公共前后缀(这里用了 宫水三叶 的图便于理解)


next
数组的构建
- 前缀 是指 不包含最后一个字符 的所有以第一个字符开头的连续子串。
- 后缀 是指 不包含第一个字符 的所有以最后一个字符结尾的连续子串。
next
数组有 很多种不同的写法,但只影响 其不匹配时 寻找 重新匹配位置 的方法
j
指向 前缀末尾 位置,i
指向 后缀末尾 位置
- 在这里我采取了
next
和 前缀表 PM
相同的方法,在这种情况下,重新匹配位置 看前一个位置的 next
数组,如下图所示,j=1, i=2, s[j]!=s[i]时
,需要重新匹配,j
要回退到前一个位置的 next
数组(即 next[j-1]
)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| public void getNext(int[] next, String s) { char[] ss = s.toCharArray(); int j = 0; next[0] = 0; for(int i = 1; i < s.length(); i++) { while(j > 0 && ss[i] != ss[j]){ j = next[j - 1]; } if(ss[i] == ss[j]){ j++; } next[i] = j; } }
|
相关力扣题