深入浅出Java算法:字符串处理类问题

深入浅出Java算法:字符串处理类问题

字符串处理是编程中最常见的问题之一,Java提供了丰富的字符串处理功能。下面我将用通俗易懂的方式介绍几种常见的字符串处理算法问题及其解决方案。

1. 字符串反转

问题:如何将一个字符串反转?

java 复制代码
// 方法1:使用StringBuilder的reverse()方法
public String reverseString1(String s) {
    return new StringBuilder(s).reverse().toString();
}

// 方法2:双指针法
public String reverseString2(String s) {
    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);
}

2. 验证回文字符串

问题:判断一个字符串是否是回文(正读反读都一样)

java 复制代码
public boolean isPalindrome(String s) {
    // 预处理:去除非字母数字字符并转为小写
    String filtered = s.replaceAll("[^A-Za-z0-9]", "").toLowerCase();
    int left = 0, right = filtered.length() - 1;
    while (left < right) {
        if (filtered.charAt(left) != filtered.charAt(right)) {
            return false;
        }
        left++;
        right--;
    }
    return true;
}

3. 字符串中的第一个唯一字符

问题:找到字符串中第一个不重复的字符的索引

java 复制代码
public int firstUniqChar(String s) {
    int[] count = new int[26]; // 存储每个字母出现的次数
    for (char c : s.toCharArray()) {
        count[c - 'a']++;
    }
    for (int i = 0; i < s.length(); i++) {
        if (count[s.charAt(i) - 'a'] == 1) {
            return i;
        }
    }
    return -1;
}

4. 有效的字母异位词

问题:判断两个字符串是否是字母异位词(字母相同但顺序不同)

java 复制代码
public boolean isAnagram(String s, String t) {
    if (s.length() != t.length()) return false;
    
    int[] count = new int[26];
    for (char c : s.toCharArray()) {
        count[c - 'a']++;
    }
    for (char c : t.toCharArray()) {
        count[c - 'a']--;
        if (count[c - 'a'] < 0) {
            return false;
        }
    }
    return true;
}

5. 最长公共前缀

问题:找出一组字符串的最长公共前缀

java 复制代码
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;
}

6. 字符串转整数(atoi)

问题:实现类似Java的Integer.parseInt()方法

java 复制代码
public int myAtoi(String s) {
    if (s == null || s.length() == 0) return 0;
    
    int index = 0, sign = 1, total = 0;
    // 1. 跳过空格
    while (index < s.length() && s.charAt(index) == ' ') {
        index++;
    }
    
    // 2. 处理符号
    if (index < s.length() && (s.charAt(index) == '+' || s.charAt(index) == '-')) {
        sign = s.charAt(index) == '+' ? 1 : -1;
        index++;
    }
    
    // 3. 转换数字
    while (index < s.length()) {
        int digit = s.charAt(index) - '0';
        if (digit < 0 || digit > 9) break;
        
        // 检查溢出
        if (Integer.MAX_VALUE / 10 < total || 
            (Integer.MAX_VALUE / 10 == total && Integer.MAX_VALUE % 10 < digit)) {
            return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
        }
        
        total = 10 * total + digit;
        index++;
    }
    
    return total * sign;
}

7. 字符串匹配(KMP算法)

问题:高效地在字符串中查找子串(比暴力法更高效)

java 复制代码
public int strStr(String haystack, String needle) {
    if (needle.isEmpty()) return 0;
    
    int[] lps = computeLPSArray(needle);
    int i = 0, j = 0;
    while (i < haystack.length()) {
        if (haystack.charAt(i) == needle.charAt(j)) {
            i++;
            j++;
            if (j == needle.length()) {
                return i - j;
            }
        } else {
            if (j != 0) {
                j = lps[j - 1];
            } else {
                i++;
            }
        }
    }
    return -1;
}

private int[] computeLPSArray(String pattern) {
    int[] lps = new int[pattern.length()];
    int len = 0, i = 1;
    while (i < pattern.length()) {
        if (pattern.charAt(i) == pattern.charAt(len)) {
            len++;
            lps[i] = len;
            i++;
        } else {
            if (len != 0) {
                len = lps[len - 1];
            } else {
                lps[i] = 0;
                i++;
            }
        }
    }
    return lps;
}

总结

字符串处理问题在面试和实际开发中都非常常见。掌握这些基本算法可以帮助你:

  1. 理解字符串的基本操作
  2. 学会使用双指针技巧
  3. 了解如何优化字符串匹配
  4. 处理边界条件和特殊情况

记住,解决字符串问题的关键在于:

  • 明确问题要求
  • 考虑所有边界情况(空字符串、特殊字符等)
  • 选择合适的数据结构(数组、哈希表等)
  • 优化时间复杂度

希望这些例子能帮助你更好地理解和解决Java中的字符串处理问题!

相关推荐
aqi0017 分钟前
FFmpeg开发笔记(六十四)使用国产的RedPlayer播放器观看网络视频
android·ffmpeg·音视频·直播·流媒体
雨白19 分钟前
扩展函数和运算符重载
android
casual_clover2 小时前
Android Studio 解决首次安装时下载 Gradle 慢问题
android·ide·android studio
天天爱吃肉82182 小时前
新能源汽车热管理核心技术解析:冬季续航提升40%的行业方案
android·python·嵌入式硬件·汽车
快乐觉主吖3 小时前
Unity的日志管理类
android·unity·游戏引擎
明月看潮生3 小时前
青少年编程与数学 01-011 系统软件简介 06 Android操作系统
android·青少年编程·操作系统·系统软件·编程与数学
snetlogon203 小时前
JDK17 Http Request 异步处理 源码刨析
android·网络协议·http
消失的旧时光-19434 小时前
Android USB 通信开发
android·java
吃汉堡吃到饱4 小时前
【Android】浅析View.post()
android
咕噜企业签名分发-淼淼4 小时前
开发源码搭建一码双端应用分发平台教程:逐步分析注意事项
android·ios