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

相关推荐
wu_android34 分钟前
Android 线性布局中常见的冲突属性总结
android
恋猫de小郭1 小时前
为什么跨平台框架可以适配鸿蒙,它们的技术原理是什么?
android·前端·flutter
张风捷特烈2 小时前
每日一题 Flutter#5,6 | 两道 Widget 选择题
android·flutter
移动开发者1号2 小时前
App主界面点击与跳转启动方式区别
android·kotlin
移动开发者1号2 小时前
我用Intent传大图片时竟然崩了,怎么回事啊
android·kotlin
androidwork14 小时前
Android LinearLayout、FrameLayout、RelativeLayout、ConstraintLayout大混战
android·java·kotlin·androidx
每次的天空14 小时前
Android第十三次面试总结基础
android·面试·职场和发展
wu_android14 小时前
Android 相对布局管理器(RelativeLayout)
android
李斯维16 小时前
循序渐进 Android Binder(二):传递自定义对象和 AIDL 回调
android·java·android studio
androidwork16 小时前
OkHttp 3.0源码解析:从设计理念到核心实现
android·java·okhttp·kotlin