
在许多文本处理场景中,我们可能需要对字符串进行字符去重,并在此基础上进行比较。具体来说,本教程将解决以下问题:给定一个目标字符串 B 和一个字符串数组 A,我们需要完成三个主要任务:
例如,如果 B = "iyee" 且 A = ["hi", "bye", "bebe"]:
为了高效地解决上述问题,我们可以将整个过程分解为两个主要部分:一个通用的字符串字符去重函数,以及一个利用该函数进行主逻辑处理的函数。
这个辅助函数负责接收一个字符串,并返回其去重后的版本。实现去重最有效的方法之一是利用 HashSet 的特性:HashSet 不允许存储重复元素。我们可以遍历输入字符串的每个字符,尝试将其添加到 HashSet 中。如果 add() 方法返回 true,则表示该字符是首次出现,我们将其添加到 StringBuilder 中以构建去重后的字符串。
立即学习“Java免费学习笔记(深入)”;
实现步骤:
主函数将协调调用 dist 函数,并执行最终的字符计数逻辑。
实现步骤:
以下是基于上述思路的完整Java代码实现:
import java.util.HashSet;
import java.util.Set;
import java.util.Arrays; // 仅用于测试打印结果
public class DistinctCharacterProcessor {
/**
* 对给定字符串进行字符去重,返回只包含唯一字符的新字符串。
* 例如:"iyee" -> "iye"
*
* @param s 待去重的字符串
* @return 去重后的字符串
*/
public static String dist(String s) {
StringBuilder sb = new StringBuilder();
Set<Character> set = new HashSet<>(); // 使用HashSet记录已遇到的字符
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (set.add(c)) { // 如果字符是第一次添加到Set中 (即是唯一的)
sb.append(c); // 则将其追加到StringBuilder
}
}
return sb.toString();
}
/**
* 处理字符串数组,统计每个去重元素与主去重字符串共享的独立字符数量。
*
* @param b 主字符串
* @param a 字符串数组
* @return 一个整数数组,包含每个数组元素与主字符串共享的独立字符数量
*/
public static int[] mathProfessor(String b, String[] a) {
// 1. 对主字符串进行去重
String distinctB = dist(b);
// 2. 存储数组a中每个元素去重后的字符串
String[] distinctA = new String[a.length];
for (int i = 0; i < a.length; i++) {
distinctA[i] = dist(a[i]);
}
// 3. 统计共享字符数量
int[] countArr = new int[a.length];
int count = 0; // 临时计数器
for (int i = 0; i < distinctA.length; i++) {
String sFromA = distinctA[i];
for (int j = 0; j < distinctB.length(); j++) {
// 检查 distinctA[i] 中的字符是否包含 distinctB 中的当前字符
// 注意:这里是检查 distinctA[i] (例如 "hi") 是否包含 distinctB 中的单个字符 (例如 'i')
if (sFromA.contains(Character.toString(distinctB.charAt(j)))) {
count++;
}
}
countArr[i] = count; // 存储当前元素的计数结果
count = 0; // 重置计数器,为下一个元素做准备
}
return countArr;
}
public static void main(String[] args) {
// 示例测试
String sampleInputB = "iyee";
String[] sampleInputA = {"hi", "bye", "bebe"};
int[] result = mathProfessor(sampleInputB, sampleInputA);
System.out.println("Input B: \"" + sampleInputB + "\"");
System.out.println("Input A: " + Arrays.toString(sampleInputA));
System.out.println("Output: " + Arrays.toString(result)); // 预期输出: [1, 2, 1]
String sampleInputB2 = "apple";
String[] sampleInputA2 = {"banana", "orange", "grape"};
int[] result2 = mathProfessor(sampleInputB2, sampleInputA2);
System.out.println("\nInput B: \"" + sampleInputB2 + "\"");
System.out.println("Input A: " + Arrays.toString(sampleInputA2));
System.out.println("Output: " + Arrays.toString(result2)); // 预期输出: [1, 1, 1] (去重apple->aple, banana->ban, orange->orng, grape->grap. ban共享a, orng共享e, grap共享a,p)
}
}本教程提供了一种清晰且高效的Java解决方案,用于处理字符串去重以及统计共享独立字符的问题。通过将字符串去重逻辑封装在独立的 dist 辅助函数中,我们提高了代码的模块化和复用性。在主函数 mathProfessor 中,我们系统地应用了去重逻辑,并利用嵌套循环完成了字符匹配和计数。HashSet 的使用是提高去重效率的关键,而 StringBuilder 则优化了字符串构建过程。理解这些核心概念和实现细节,将有助于开发者在面对类似字符串处理任务时,设计出健壮且高性能的解决方案。
以上就是Java教程:高效处理字符串去重与共享字符计数的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号