模拟实现trim()方法
- 创建一个函数,遍历字符串,记录第一个非空格字符的位置作为左边界,同时记录最后一个非空格字符的位置作为右边界,然后截取左右边界的子串。
字符串反转
- 整体反转:将字符串转换为字符数组,使用双指针交换首尾字符直至中间,然后重新构建字符串。
- 指定部分反转:同样将子串转换为字符数组,使用双指针交换指定范围内的首尾字符。
查找子串出现次数
- 使用indexOf()方法,从头开始查找子串,每当找到一个就更新计数,并将下次查找的起始位置设为本次查找结束位置+1,直到找不到为止。
判断字符串是否为回文
- 可以通过比较字符串与其反转字符串是否相等来判断,或者利用双指针从两端向中间移动比较字符是否一致。
连接字符串不使用
+
或concat()
- 创建一个StringBuilder或StringBuffer对象,调用append()方法逐个添加字符串,最后调用toString()方法返回结果。
替换子串
- 使用StringBuilder的replace()方法,或者手动遍历字符串并在发现匹配子串时插入新子串。
检查字符串是否包含连续重复字符
- 遍历字符串,比较当前字符与下一个字符是否相等,若相等则表示存在连续重复字符。
删除字符串中连续的重复字符
- 创建一个新的StringBuilder,遍历输入字符串,在连续字符重复时只将首个字符添加至新字符串中。
翻转单词顺序
- 分割字符串为单词数组,然后逆序遍历数组并将单词之间加入空格,最后合并成新的字符串。
字符串中最长的公共前后缀
- 从前向后遍历字符串,同时从后向前遍历字符串,对比两者的字符,找到最长的公共前缀和后缀。
KMP算法实现
- 构建next数组,用于存储模式串的部分匹配值,然后在文本串中搜索,失败时利用next数组快速回溯。
Z字形变换
- 创建一个二维数组模拟Z字形路径,根据行数和列数的奇偶性决定字符的填充方向。
判断两个字符串是否互为变形词(异位词)
- 将两个字符串转换为字符数组并排序,比较排序后的数组是否相等。
计算字符串的最长递增子序列
- 使用动态规划思想,dp[i]表示以第i个字符结尾的最长递增子序列长度,遍历字符串更新dp数组。
字符串分割问题
- 使用Java的split()方法传入分隔符,或者手动遍历字符串并根据分隔符切割成子串放入数组。
最小窗口子串
- 使用滑动窗口方法,维持一个满足条件的窗口,不断尝试收缩和扩展窗口,记录满足条件的最小区间。
验证括号的有效性
- 使用栈数据结构,遍历字符串,遇到左括号入栈,遇到右括号检查栈顶元素是否与之匹配,匹配则出栈,遍历结束后栈为空则有效。
字符替换求解最小子串
- 计算字符映射后的字符串与目标字符串的编辑距离(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();
}
// 使用方式