18 道 Java 字符串相关算法题思路简介及代码实现

  1. 模拟实现trim()方法

    • 创建一个函数,遍历字符串,记录第一个非空格字符的位置作为左边界,同时记录最后一个非空格字符的位置作为右边界,然后截取左右边界的子串。
  2. 字符串反转

    • 整体反转:将字符串转换为字符数组,使用双指针交换首尾字符直至中间,然后重新构建字符串。
    • 指定部分反转:同样将子串转换为字符数组,使用双指针交换指定范围内的首尾字符。
  3. 查找子串出现次数

    • 使用indexOf()方法,从头开始查找子串,每当找到一个就更新计数,并将下次查找的起始位置设为本次查找结束位置+1,直到找不到为止。
  4. 判断字符串是否为回文

    • 可以通过比较字符串与其反转字符串是否相等来判断,或者利用双指针从两端向中间移动比较字符是否一致。
  5. 连接字符串不使用+concat()

    • 创建一个StringBuilder或StringBuffer对象,调用append()方法逐个添加字符串,最后调用toString()方法返回结果。
  6. 替换子串

    • 使用StringBuilder的replace()方法,或者手动遍历字符串并在发现匹配子串时插入新子串。
  7. 检查字符串是否包含连续重复字符

    • 遍历字符串,比较当前字符与下一个字符是否相等,若相等则表示存在连续重复字符。
  8. 删除字符串中连续的重复字符

    • 创建一个新的StringBuilder,遍历输入字符串,在连续字符重复时只将首个字符添加至新字符串中。
  9. 翻转单词顺序

    • 分割字符串为单词数组,然后逆序遍历数组并将单词之间加入空格,最后合并成新的字符串。
  10. 字符串中最长的公共前后缀

    • 从前向后遍历字符串,同时从后向前遍历字符串,对比两者的字符,找到最长的公共前缀和后缀。
  11. KMP算法实现

    • 构建next数组,用于存储模式串的部分匹配值,然后在文本串中搜索,失败时利用next数组快速回溯。
  12. Z字形变换

    • 创建一个二维数组模拟Z字形路径,根据行数和列数的奇偶性决定字符的填充方向。
  13. 判断两个字符串是否互为变形词(异位词)

    • 将两个字符串转换为字符数组并排序,比较排序后的数组是否相等。
  14. 计算字符串的最长递增子序列

    • 使用动态规划思想,dp[i]表示以第i个字符结尾的最长递增子序列长度,遍历字符串更新dp数组。
  15. 字符串分割问题

    • 使用Java的split()方法传入分隔符,或者手动遍历字符串并根据分隔符切割成子串放入数组。
  16. 最小窗口子串

    • 使用滑动窗口方法,维持一个满足条件的窗口,不断尝试收缩和扩展窗口,记录满足条件的最小区间。
  17. 验证括号的有效性

    • 使用栈数据结构,遍历字符串,遇到左括号入栈,遇到右括号检查栈顶元素是否与之匹配,匹配则出栈,遍历结束后栈为空则有效。
  18. 字符替换求解最小子串

    • 计算字符映射后的字符串与目标字符串的编辑距离(Levenshtein距离),编辑距离即为最少替换次数。

1. 模拟实现trim()方法

public String customTrim(String str) {
   
    int start = 0, end = str.length() - 1;
    while (start < str.length() && str.charAt(start) == ' ') start++;
    while (end >= 0 && str.charAt(end) == ' ') end--;
    return str.substring(start, end + 1);
}

2. 字符串反转

public String reverseWholeString(String s) {
   
    char[] chars = s.toCharArray();
    int start = 0, end = chars.length - 1;
    while (start < end) {
   
        char temp = chars[start];
        chars[start] = chars[end];
        chars[end] = temp;
        start++;
        end--;
    }
    return new String(chars);
}

// 反转指定部分字符串
public String reverseSubstring(String s, int i, int j) {
   
    char[] chars = s.toCharArray();
    while (i < j) {
   
        char temp = chars[i];
        chars[i] = chars[j];
        chars[j] = temp;
        i++;
        j--;
    }
    return new String(chars);
}

3. 查找子串出现次数

public int countSubStr(String str, String subStr) {
   
    int count = 0;
    int index = 0;
    while ((index = str.indexOf(subStr, index)) != -1) {
   
        count++;
        index += subStr.length();
    }
    return count;
}

4. 判断字符串是否为回文:

public boolean isPalindrome(String str) {
   
    // 移除非字母数字字符并转换为小写
    str = str.replaceAll("[^a-zA-Z0-9]", "").toLowerCase();
    
    int start = 0, end = str.length() - 1;
    while (start < end) {
   
        if (str.charAt(start) != str.charAt(end)) {
   
            return false;
        }
        start++;
        end--;
    }
    return true;
}

或 最简单实现:

public boolean isPalindrome(String str) {
     
    return new StringBuffer(str).reverse().toString().equals(str);
}

5. 连接字符串不使用 +concat()

import java.util.Arrays;

public String concatenateStrings(String... strings) {
   
    StringBuilder sb = new StringBuilder();
    for (String str : strings) {
   
        sb.append(str);
    }
    return sb.toString();
}

你可能感兴趣的:(java,解题训练,java,算法,python)