深入浅出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中的字符串处理问题!

相关推荐
时光少年2 小时前
Android 副屏录制方案
android·前端
时光少年2 小时前
Android 局域网NIO案例实践
android·前端
alexhilton2 小时前
Jetpack Compose的性能优化建议
android·kotlin·android jetpack
流浪汉kylin2 小时前
Android TextView SpannableString 如何插入自定义View
android
火柴就是我3 小时前
git rebase -i,执行 squash 操作 进行提交合并
android
你说你说你来说4 小时前
安卓广播接收器(Broadcast Receiver)的介绍与使用
android·笔记
你说你说你来说4 小时前
安卓Content Provider介绍及使用
android·笔记
RichardLai885 小时前
[Flutter学习之Dart基础] - 类
android·flutter
_一条咸鱼_5 小时前
深度解析 Android MVI 架构原理
android·面试·kotlin
火柴就是我6 小时前
git rebase -i 修改某次提交的message
android