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

相关推荐
手机不死我是天子3 小时前
《Android 核心组件深度系列 · 第 2 篇 Service》
android
前行的小黑炭4 小时前
Compose页面切换的几种方式:Navigation、NavigationBar+HorizontalPager,会导致LaunchedEffect执行?
android·kotlin·app
前行的小黑炭4 小时前
Android :Comnpose各种副作用的使用
android·kotlin·app
BD_Marathon18 小时前
【MySQL】函数
android·数据库·mysql
西西学代码18 小时前
安卓开发---耳机的按键设置的UI实例
android·ui
maki0771 天前
虚幻版Pico大空间VR入门教程 05 —— 原点坐标和项目优化技巧整理
android·游戏引擎·vr·虚幻·pico·htc vive·大空间
千里马学框架1 天前
音频焦点学习之AudioFocusRequest.Builder类剖析
android·面试·智能手机·车载系统·音视频·安卓framework开发·audio
fundroid1 天前
掌握 Compose 性能优化三步法
android·android jetpack
TeleostNaCl1 天前
如何在 IDEA 中使用 Proguard 自动混淆 Gradle 编译的Java 项目
android·java·经验分享·kotlin·gradle·intellij-idea
旷野说1 天前
Android Studio Narwhal 3 特性
android·ide·android studio