2012-03-21 98 views
0

在过去一小时里,我一直在绞尽脑汁想知道如何做到这一点。这更像是一个逻辑问题,而不是我想的技术问题。计算两个字符串有多少个重复字符

我有两个字符串,并希望统计他们有多少共同的字符。即艾米莉+安迪= 1.

我以为我可以将字符串转换为字符数组,并使用两个For语句在对方通过每个可能性,但我不是100%我会怎么做。我搜索了谷歌的答案,但我没有得到任何地方。

我很抱歉没有提供任何代码,我目前没有任何代码。我对Java相当陌生,我不确定如何去解决这个问题。

任何人都有解决方案?

+2

对于输入Emilyy和Andyy,你期待2或1作为结果? Emilyy和Andy怎么样? – 2012-03-21 04:07:51

+0

这看起来像一个家庭作业。您所描述的方法将给出结果,但可能会有更多最佳解决方案。 – Jayan 2012-03-21 04:08:40

+0

艾米特,这不重要,我宁愿它返回1。 Jayan - 不是作业,我想要更熟悉Android/Java,我正在写一个花哨的'个性配对应用程序',这将成为'公式'的一部分 – CitizenSmif 2012-03-21 04:12:44

回答

3

首先,您必须删除两个字符串中的重复字母,然后您必须进行比较。下面的代码工作正常。

public class CountDuplicates { 

    /** 
    * Author Krishnan 
    */ 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     String str1 = "palani"; 
     String str2 = "krishnan"; 
     String str11 = ""; 
     String str12 = ""; 
     char[] ch1 = str1.toCharArray(); 
     char[] ch2 = str2.toCharArray(); 
     int count = 0; 
     for(int i=0; i<ch1.length; i++) 
     { 
      if(!str11.contains(ch1[i]+"")) 
      { 
       str11 += ch1[i]; 
      } 
     } 
     for(int i=0; i<ch2.length; i++) 
     { 
      if(!str12.contains(ch2[i]+"")) 
      { 
       str12 += ch2[i]; 
      } 
     } 
     char[] ch11 = str11.toCharArray(); 
     char[] ch12 = str12.toCharArray(); 
     for(int i=0; i<ch11.length; i++) 
     { 
      for(int j=0; j<ch12.length; j++) 
      { 
       if(ch11[i] == ch12[j]) 
       { 
        count++; 
       } 
      } 
     } 
     System.out.println("Duplicate Letters: " + count); 
    } 

} 

输出:

重复快报:3

+0

谢谢,工作完美。 – CitizenSmif 2012-03-21 04:44:40

1

您可以将每个字符串转换为一个集合,然后执行一组交集,以找出字符可能共有的方式。这可能更容易理解。

0

你可以遍历第一个字符串把每个字符键一个Hashtable中以0

迭代的在第二个字符串值,如果字符是在哈希表,取代它与1

迭代散列表并添加您的值。

0

下面的方法将在两个不同的字符串中打印通用字符。

public void compareString(String s1, String s2) { 
     List<Character> charList = new ArrayList<Character>(); 
    int count = 0; 
    for(char c : S1.toCharArray()) { 
     if(!charList.contains(c)) { 
      INNER: for(char c1 : S2.toCharArray()) { 
       if(c == c1) { 
        count = count+1; 
        charList.add(c); 
        System.out.println(c1); 
        break INNER; 
       } 
      } 
     } 
    } 
    System.out.println("Duplicated Characters in two different strings :"+count); 
    } 
+0

如果两个字符串都包含一个重复的字符,说'a'两次,它会给出4的计数,并打印'一个'4次,这是我不正确的。 – gbulmer 2012-03-21 04:38:12

+0

糟糕,你的正确gbulmer。感谢您指出这一点 – CitizenSmif 2012-03-21 04:39:02

+0

感谢您通知我的错误。我根据您的建议修改了代码。再次感谢gbulmer – kandarp 2012-03-21 04:51:25

1

这肯定听起来像一个家庭作业......但如果不是这样,我会通过转换字符串的字符数组,写一个嵌套循环,每个字符进行比较和递增计数器解决这个问题时,匹配被发现。如果你只计算每个字母一次,那么算法会改变一点。

+0

感谢您的评论。说实话不是功课,我现在还没有上过教育。 – CitizenSmif 2012-03-21 04:44:06

0

这看起来像功课。

的传统方法,它适用于大多数语言是:

  1. 转换字符串字符数组的数组
  2. 排序,为必要时删除重复递增的顺序
  3. ,或者使用一个假值,和求助于,或洗牌起来,这是while循环中,使用i和j的一个原因进行排序在一个沿所述阵列
  4. 迭代:
    当[I]> b [j]时,增量Ĵ,
    当[I] < B [J],增量I,
    否则,你有一个匹配,输出,它保存在一个数组,或者只是指望它,并增加我&Ĵ
  5. 退出循环当一个阵列被耗尽,I>的最后一个元素,或b> b

完成的最后一个元素

1
String s1 = "abbccsartcc"; 
    String s2 = "cbdcezxrtcc"; 
    Set arrSet1 = new HashSet(convertToList(s1)); 
    Set arrSet2 = new HashSet(convertToList(s2)); 
    arrSet1.retainAll(arrSet2) 
    System.out.println("Similar characters-->" + arrSet1.size()); 

convertToList方法:

private static List convertToList(String str) { 
    List tempList = new ArrayList(); 
    char[] arr = str.toCharArray(); 
    for (char a : arr) { 
     tempList.add(String.valueOf(a)); 
    } 
    return tempList; 
} 

这将完美地工作! HTH !!

0

您可以使用ArrayList来解决这个问题如下,我只是把这个在一起,真正的快,但它应该是一个良好的开端:

import java.util.ArrayList; 

    public class StringCount { 

/** 
* @param args 
*/ 
public static void main(String[] args) { 

    // Get the strings from the command line or pass into method. 
    String name1 = "Emyyilyyyyy"; 
    String name2 = "Andyyyy"; 
    int count = 0; 

    ArrayList<String> cache = new ArrayList<String>(); 


    for (int i = 0;i < name1.length();i++) 
    { 
     String check = name1.substring(i, i+1); 
     System.out.println("Letter to check: " + check); 
     if (name2.indexOf(check) != -1) 
     { 
      // Check to see if we already found the character so we don't count it again 
      if (!cache.contains(check)) 
      { 
       System.out.println("Found: " + check + " in: " + name2); 
       cache.add(check); 
       count++; 
      } 
     } 

    } 
    System.out.println(); 
    System.out.println("Count = " + count); 



    } 

    }