在Java字符串算法题目中,掌握各种字符串操作方法至关重要。下面系统性地讲解常用的字符串处理方法:

1. 字符串基础操作

长度和空值判断

String str = "Hello World";

// 获取长度
int len = str.length(); // 11

// 判断是否为空
boolean isEmpty = str.isEmpty(); // false
boolean isBlank = str.isBlank(); // false (Java 11+)

// 空字符串检查
if (str == null || str.isEmpty()) {
    // 处理空字符串
}

字符访问

String str = "Hello";

// 获取指定位置字符
char first = str.charAt(0); // 'H'
char last = str.charAt(str.length() - 1); // 'o'

// 字符数组转换
char[] chars = str.toCharArray();

2. 字符串比较

String s1 = "abc";
String s2 = "ABC";

// 精确比较
boolean exact = s1.equals(s2); // false

// 忽略大小写比较
boolean ignoreCase = s1.equalsIgnoreCase(s2); // true

// 字典序比较
int result = s1.compareTo(s2); // 正数:s1 > s2

// 前缀后缀检查
boolean starts = s1.startsWith("ab"); // true
boolean ends = s1.endsWith("bc"); // true

3. 字符串查找

String str = "hello world, hello java";

// 查找字符位置
int firstIndex = str.indexOf('l'); // 2
int lastIndex = str.lastIndexOf('l'); // 20

// 查找子字符串
int subIndex = str.indexOf("hello"); // 0
int subFrom = str.indexOf("hello", 1); // 13

// 检查包含关系
boolean contains = str.contains("world"); // true

4. 字符串截取和分割

截取子串

String str = "Hello World";

// 从指定位置到末尾
String sub1 = str.substring(6); // "World"

// 指定开始和结束位置
String sub2 = str.substring(0, 5); // "Hello"

字符串分割

String data = "apple,banana,orange";

// 按逗号分割
String[] fruits = data.split(",");
// ["apple", "banana", "orange"]

// 限制分割次数
String[] limited = data.split(",", 2);
// ["apple", "banana,orange"]

// 使用正则表达式分割
String complex = "a b  c   d";
String[] parts = complex.split("\\s+");
// ["a", "b", "c", "d"]

5. 字符串修改

替换操作

String str = "hello world";

// 字符替换
String replaced = str.replace('l', 'L'); // "heLLo worLd"

// 字符串替换
String newStr = str.replace("world", "Java"); // "hello Java"

// 正则替换
String regexReplaced = str.replaceAll("l+", "L"); // "heLo worLd"

大小写转换

String str = "Hello World";

String lower = str.toLowerCase(); // "hello world"
String upper = str.toUpperCase(); // "HELLO WORLD"

去除空格

String str = "  hello world  ";

String trimmed = str.trim(); // "hello world"
String stripped = str.strip(); // "hello world" (Java 11+)
String leading = str.stripLeading(); // "hello world  "
String trailing = str.stripTrailing(); // "  hello world"

6. 字符串构建

StringBuilder (非线程安全,性能好)

StringBuilder sb = new StringBuilder();

// 追加操作
sb.append("Hello");
sb.append(" ");
sb.append("World");

// 插入操作
sb.insert(5, " Java");

// 删除操作
sb.delete(5, 10);

// 反转
sb.reverse();

String result = sb.toString();

StringBuffer (线程安全)

StringBuffer sb = new StringBuffer();
// 方法与StringBuilder相同,但线程安全

7. 字符串转换

// 基本类型转字符串
String numStr = String.valueOf(123);
String doubleStr = String.valueOf(45.67);

// 字符串转基本类型
int num = Integer.parseInt("123");
double d = Double.parseDouble("45.67");

// 字符数组转字符串
char[] chars = {'a', 'b', 'c'};
String fromChars = new String(chars);

8. 正则表达式匹配

String str = "abc123def456";

// 检查匹配
boolean matches = str.matches(".*\\d+.*"); // true

// 提取匹配部分
java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("\\d+");
java.util.regex.Matcher matcher = pattern.matcher(str);

while (matcher.find()) {
    System.out.println(matcher.group()); // 输出: 123, 456
}

9. 实用算法示例

回文判断

public boolean isPalindrome(String s) {
    s = s.toLowerCase().replaceAll("[^a-z0-9]", "");
    int left = 0, right = s.length() - 1;
    while (left < right) {
        if (s.charAt(left) != s.charAt(right)) {
            return false;
        }
        left++;
        right--;
    }
    return true;
}

字符串反转

public String reverseString(String s) {
    // 方法1: 使用StringBuilder
    return new StringBuilder(s).reverse().toString();
  
    // 方法2: 字符数组
    char[] chars = s.toCharArray();
    int left = 0, right = chars.length - 1;
    while (left < right) {
        char temp = chars[left];
        chars[left] = chars[right];
        chars[right] = temp;
        left++;
        right--;
    }
    return new String(chars);
}

最长公共前缀

public String longestCommonPrefix(String[] strs) {
    if (strs == null || strs.length == 0) return "";
  
    String prefix = strs[0];
    for (int i = 1; i < strs.length; i++) {
        while (strs[i].indexOf(prefix) != 0) {
            prefix = prefix.substring(0, prefix.length() - 1);
            if (prefix.isEmpty()) return "";
        }
    }
    return prefix;
}

10. 性能考虑

  • 字符串拼接:使用 +在循环中拼接字符串性能差,推荐使用 StringBuilder
  • 字符串比较equals()比较内容,==比较引用
  • 大量字符串操作:优先使用 StringBuilder

这些方法覆盖了字符串算法题目中的大部分需求,熟练掌握它们能有效解决各类字符串相关问题。