字符串
字数
796 字
阅读时间
4 分钟
反转字符串
思路:简单的左右双指针应用。
java
class Solution {
public void reverseString(char[] s) {
int left = 0, right = s.length - 1;
while (left < right) {
char temp = s[left];
s[left] = s[right];
s[right] = temp;
left++;
right--;
}
}
}反转字符串 II
思路:按照题目要求,每隔 2k 个字符翻转前 k 个字符。
难点:
- 循环步长为
i = i + 2 * k。 - 确定每次翻转的右边界:
right = Math.min(str.length - 1, left + k - 1)。
java
class Solution {
public String reverseStr(String s, int k) {
char[] str = s.toCharArray();
for (int i = 0; i < s.length(); i += 2 * k) {
int left = i;
// 确定翻转的右边界,不能超过字符串长度
int right = Math.min(str.length - 1, left + k - 1);
while (left < right) {
// 使用异或交换字符,避免使用临时变量
str[left] ^= str[right];
str[right] ^= str[left];
str[left] ^= str[right];
left++;
right--;
}
}
return new String(str);
}
}替换空格
剑指 Offer 05. 替换空格 - 力扣(LeetCode)
思路:
- 使用
StringBuilder逐个复制:遍历原字符串,遇到空格则替换为"%20",否则直接复制。 - 使用正则表达式:利用
String.replaceAll()方法进行替换,简单粗暴。
StringBuilder 实现
java
class Solution {
public String replaceSpace(String s) {
if (s == null) {
return null;
}
// 选用 StringBuilder,在单线程环境下性能较好
StringBuilder sb = new StringBuilder();
// 使用 sb 逐个复制 str,碰到空格则替换,否则直接复制
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == ' ') {
sb.append("%20");
} else {
sb.append(s.charAt(i));
}
}
return sb.toString();
}
}正则表达式实现
java
class Solution {
public String replaceSpace(String s) {
// 使用正则表达式将所有空格替换为 "%20"
return s.replaceAll("\\s", "%20");
}
}翻转字符串里的单词
左旋转字符串
剑指 Offer 58 - II. 左旋转字符串 - 力扣(LeetCode)
思路:
- 切片 (substring):直接使用字符串的切片功能。
- 字符串遍历赋值给新字符串:通过循环构建新字符串。
- 字符串遍历拼接:利用
StringBuffer或StringBuilder进行拼接。
字符串遍历拼接(优化)
java
class Solution {
public String reverseLeftWords(String s, int n) {
StringBuffer res = new StringBuffer();
// 从 n 开始遍历,然后通过取余操作实现循环拼接
for (int i = n; i < s.length() + n; ++i) {
res.append(s.charAt(i % s.length()));
}
return res.toString();
}
}实现 strStr()
28. 找出字符串中第一个匹配项的下标 - 力扣(LeetCode)
思路: 相比时间复杂度为 O(m * n) 的双重 for 循环暴力破解,KMP 算法可以将时间复杂度优化到 O(m + n)。
KMP 算法 (Knuth-Morris-Pratt) 当出现字符串不匹配时,KMP 算法可以利用之前已经匹配的文本信息,避免从头再进行匹配,从而提高效率。
重复子字符串
思路:与 实现 strStr() 类似,最优解通常也涉及 KMP 算法的思想。