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

相关推荐
笨鸭先游44 分钟前
前台--Android开发
android
fareast_mzh1 小时前
Lightweight App Alternatives
android
pq113_65 小时前
OrangePi Zero 3学习笔记(Android篇)4 - eudev编译(获取libudev.so)
android·笔记·学习
鸿蒙布道师9 小时前
鸿蒙NEXT开发动画案例3
android·ios·华为·harmonyos·鸿蒙系统·arkui·huawei
鸿蒙布道师9 小时前
AI原生手机:三大技术阵营的终极对决与未来展望
android·人工智能·ios·华为·智能手机·ai-native·hauwei
每次的天空9 小时前
移动应用开发:自定义 View 处理大量数据的性能与交互优化方案
android·java·学习·交互
Huang兄10 小时前
Android 项目中配置了多个 maven 仓库,但依赖还是下载失败,除了使用代理,还有其他方法吗?
android·gradle·maven
snail20121111 小时前
Flutter接入ProtoBuff和原生Android通信【性能最优】
android·flutter
難釋懷12 小时前
Android开发-常用布局
android·gitee
墨菲斯托88812 小时前
fakebook
android