计算字符串中的常见字符数和字符串向量

问题描述:

我的问题是如何计数但不计算两次相同的字符。就像比较'aba'和'are'一样,结果应该是1,因为它只有一个字符。计算字符串中的常见字符数和字符串向量

这是我到目前为止:

public int sameChars (Vector<String> otherStrs){ 
    int result = 0; 
    String original = "aba"; 
    for (int h= 0; h< otherStrs.size(); h++) { 
     String targetStr = otherStrs.get(h); 
     for (int i=0; i< original.length(); i++) { 
      char aux = original.charAt(i); 
      for (int j=0; j< Math.min(original.length(), targetStr.length()); j++) { 
       char targetAux = targetStr.charAt(j); 
       if (aux == targetAux) { 
        result++; 
        break; 
       } 
      } 
     } 
    } 
    return result; 
} 

想法,欢迎,谢谢。

+0

功课吧? – 2009-11-19 18:34:59

您可以从原始字符串中创建字符数的散列。然后,对于每个目标字符串,检查它的哈希中是否有一个非零值的字符。这会阻止多次扫描原始字符串。

伪代码:

For each char c in original string { 
    hash[c]++ 
} 
For each target string str { 
    For each char c_ in str { 
    if hash[c_] > 0 { 
     result++; 
    } 
    } 
} 

这气味像功课,所以这里的仅仅是基本的想法:你需要保持你已经算作是在这两个地方是鲜明的人物的轨道。一套可能是一个很好的方法来做到这一点。在增加计数器之前,请检查您正在查看的角色是否已经在该组中。

+0

完成,谢谢。 – d0pe 2009-11-19 18:44:58

我不确定要了解您的要求:您是否想要计算在参考字符串原始中找到的不同字符(此处为“aba”,因此“a”和“b”)在一组中找到的次数存储在Vector otherStrs中的字符串?

如果是这种情况,我会建议先将原始字符串减少为不同的字符(查找和删除重复项或使用Map)。然后循环遍历Vector中的字符串,并在每次找到一个字符时增加计数器之前为每个字符串执行相同操作(删除重复项或使用Map)。

出于好奇,这个计算的最终目标是什么?

+0

这是一个项目的一个哑巴部分,基本上我得到一个名字,并且必须与矢量中的其他名称进行比较,同时计算它们之间的常用字符数量,并且不会为每个唯一字符计数超过一次。 – d0pe 2009-11-19 18:38:48

这里是我的实现:

public static int commonChars(String s1, String s2) { 
    if (s1 == null || s1.isEmpty()) 
     throw new IllegalArgumentException("Empty s1"); 
    if (s2 == null || s2.isEmpty()) 
     throw new IllegalArgumentException("Empty s2"); 

    char[] a1 = s1.toCharArray(); 
    char[] a2 = s2.toCharArray(); 

    Arrays.sort(a1); 
    a1 = removeDups(a1); 
    Arrays.sort(a2); 
    a2 = removeDups(a2); 

    int count = 0; 

    for (int i = 0, j = 0; i < a1.length && j < a2.length;) { 
     if (a1[i] == a2[j]) { 
      i++; 
      j++; 
      count++; 
     } 
     else if (a1[i] > a2[j]) 
      j++; 
     else 
      i++; 
    } 

    return count; 
} 

public static char[] removeDups(char[] array) { 
    char[] aux = new char[array.length]; 
    int c = 1; 
    aux[0] = array[0]; 
    for (int i = 1 ; i < array.length; i++) { 
     if (array[i] != array[i-1]) 
      aux[c++] = array[i]; 
    } 
    return Arrays.copyOf(aux, c); 
}