Java - 计算在另一个字符串中显示的字符数

时间:2012-03-24 21:36:34

标签: java

我在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”。有没有人有任何建议或意见?非常感谢你。

5 个答案:

答案 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