我在Java中比较两个字符串,看看第一个字符串中有多少个字符出现在第二个字符串中。以下是一些期望:
matchingChars("AC", "BA") → 1
matchingChars("ABBA", "B") → 2
matchingChars("B", "ABBA") → 1
我的方法如下:
public int matchingChars(String str1, String str2) {
int count = 0;
for (int a = 0; a < str1.length(); a++)
{
for (int b = 0; b < str2.length(); b++)
{ char str1Char = str1.charAt(a);
char str2Char = str2.charAt(b);
if (str1Char == str2Char)
{ count++;
str1 = str1.replace(str1Char, '0');
}
}
}
return count;
}
我知道我的方法不是最好的,但我认为应该这样做。但是,对于
matchingChars("ABBA", "B") → 2
我的代码产生“1”而不是“2”。有没有人有任何建议或意见?非常感谢你。
答案 0 :(得分:2)
假设比较“AABBB”和“AAAABBBCCC”应该返回15(2 * 3 + 3 * 3 + 0 * 3),然后:
对于每个字符串,从字符串的字符到字符数的映射。 计算两个映射的键集的交集。 对于键集中的每个元素,都会累积值的乘积。打印结果。 这是两个字符串大小的线性关系。
答案 1 :(得分:1)
是否可以在家庭作业问题上提供工作代码?
public long testStringCount() {
String a = "AABBBCCC";
String b = "AAABBBDDDDD";
Map<Character,Integer> aMap = mapIt(a);
Map<Character,Integer> bMap = mapIt(b);
Set<Character> chars = Sets.newHashSet(aMap.keySet());
chars.addAll(bMap.keySet());
long result = 0;
for (Character c : chars) {
Integer ac = aMap.get(c);
Integer bc = bMap.get(c);
if (null != ac && null != bc) {
result += ac*bc;
}
}
return result;
}
private Map<Character, Integer> mapIt(String a) {
Map<Character,Integer> result = Maps.newHashMap();
for (int i = 0; i < a.length(); i++) {
Character c = a.charAt(i);
Integer x = result.get(c);
if (null == x) {
x = 0;
}
x++;
result.put(c, x);
}
return result;
}
答案 2 :(得分:0)
显然,您必须确保只计算字符串1中的唯一字符。您需要重复计算B
因为您计算B
两次,字符串1中每次出现一次。
答案 3 :(得分:0)
那么你的代码只显示1,因为这行:
str1 = str1.replace(str1Char, '0');
那将“ABBA”变成“A00A” - 所以第二个B不会被看到。
也许您应该将第二个字符串转换为HashSet<Character>
而不是......然后你可以使用类似的东西:
int count = 0;
for (int i = 0; i < str1.length; i++)
{
if (otherSet.contains(str1.charAt(i))
{
count++;
}
}
目前尚不清楚你想要从“ABBA”/“CBCB”得到什么结果 - 如果它是2(因为有2个B),那么上述方法将起作用。如果它是4(因为第一个字符串中的2个B中的每个B与第二个字符串中的2个B匹配),那么 all 您需要做的就是摆脱replace
调用。
for (int a = 0; a < str1.length(); a++)
{
for (int b = 0; b < str2.length(); b++)
{
if (str1.charAt(a) == str2.charAt(b))
{
count++;
// Terminate the inner loop which is iterating over str2,
// and move on to the next character in str1
break;
}
}
}
答案 4 :(得分:0)
您的解决方案有效,但是是二次方的。如果所有字符都低于256,那么你可以这样做:
int matching(String s1, String s2) {
int[] count1 = frequencies(s1);
int[] count2 = frequencies(s2);
sum = 0;
for(int i = 0; i< 256; i++) {
sum += count1[i]*count2[i] != 0 ? Math.max(count1[i], count2[i]) : 0;
}
return sum;
}
int[] frequencies(String s) {
int[] ret = new int[256];
for(char c : s) {
int[c]+=1;
}
}
否则,您需要multiset。