Skip to content

字符串

字数
796 字
阅读时间
4 分钟

反转字符串

344. 反转字符串 - 力扣(LeetCode)

思路:简单的左右双指针应用。

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

541. 反转字符串 II - 力扣(LeetCode)

思路:按照题目要求,每隔 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)

思路

  1. 使用 StringBuilder 逐个复制:遍历原字符串,遇到空格则替换为 "%20",否则直接复制。
  2. 使用正则表达式:利用 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");
    }
}

翻转字符串里的单词

151. 颠倒字符串中的单词 - 力扣(LeetCode)

左旋转字符串

剑指 Offer 58 - II. 左旋转字符串 - 力扣(LeetCode)

思路

  1. 切片 (substring):直接使用字符串的切片功能。
  2. 字符串遍历赋值给新字符串:通过循环构建新字符串。
  3. 字符串遍历拼接:利用 StringBufferStringBuilder 进行拼接。

字符串遍历拼接(优化)

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 算法可以利用之前已经匹配的文本信息,避免从头再进行匹配,从而提高效率。

重复子字符串

459. 重复的子字符串 - 力扣(LeetCode)

思路:与 实现 strStr() 类似,最优解通常也涉及 KMP 算法的思想。

贡献者

The avatar of contributor named as jiechen jiechen

页面历史

撰写