深入浅出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;
}
总结
字符串处理问题在面试和实际开发中都非常常见。掌握这些基本算法可以帮助你:
- 理解字符串的基本操作
- 学会使用双指针技巧
- 了解如何优化字符串匹配
- 处理边界条件和特殊情况
记住,解决字符串问题的关键在于:
- 明确问题要求
- 考虑所有边界情况(空字符串、特殊字符等)
- 选择合适的数据结构(数组、哈希表等)
- 优化时间复杂度
希望这些例子能帮助你更好地理解和解决Java中的字符串处理问题!