我试图比较两个字符数组,其中第一个数组比第二个数组长一个字符。我想看看更大的数组是否包含较小数组中的所有字符。
例如,给定数组:
char[] biggest = {'a', 'b', 'c', 'd', 'e'}; //5 elements
char[] smallest = {'c', 'b', 'd', 'a'}; //4 elements
比较这些应该评估为true,因为较小的数组包含字符c,b,d和a,所有这些都包含在最大的数组中(无论顺序如何)。
现在,我正在思考:
以下是我的代码:
int matchCounter = 0;
//For each character in the biggest array
for(int i = 0; i < biggest.length; i++) {
//Loop through the smallest array
for(int j = 0; j < smallest.length; j++) {
if(biggest[i] == smallest[j]) { //See if the current character in the biggest array exists anywhere in the smallest array
matchCounter++;
}
}
}
非常感谢任何帮助!
**更新**
运行之后,我没有得到预期的答案。我认为当我有包含重复字符的数组时会出现问题:
例如
char[] biggest = {'s', 'e', 'e', 'i', 'n', 'g'};
char[] smallest = {'e', 'e', 'i', 'g', 'n'};
/*Loop to compare biggest and smallest, incrementing matchCounter when equal. */
//If the biggest array has a matchCount equal to the smallest array (means the biggest array contains all the characters in the smallest array, plus an additional character)
if(matchCounter == word.length()) {
System.out.println("Suggested word: " + foundWord);
}
因为它似乎工作正常!
答案 0 :(得分:2)
你的方法会给出正确的答案,但它很慢,因为你保证每次都在每个数组中循环,给出 O(n 2 )运行时。
在保持类似方法的同时,提高速度的一种方法是对更大的集合进行排序。这允许您对较小集合中的每个字符进行二进制搜索,而不是每次都必须一直迭代:
int matchCounter = 0;
Arrays.sort(biggest);
for (char c : smallest) {
if (Arrays.binarySearch(biggest, c) >= 0) {
matchCounter++;
}
}
System.out.println(matchCounter); // 4
答案 1 :(得分:1)
使用Set
:
public static boolean allContained(char[] big, char[] small) {
Set<Character> chars = new HashSet<>(big.length);
for(char c : big) {
chars.add(c);
}
for(char c : small) {
if(!chars.contains(c)) {
return false; // small contains elements that are not in big
}
}
return true;
}