Посчитайте, сколько повторяющихся символов в двух строках - PullRequest
0 голосов
/ 21 марта 2012

Последние сутки я ломал голову, размышляя, как это сделать. Я думаю, это скорее логический вопрос, чем технический.

У меня есть две строки, и я хочу посчитать, сколько у них общих символов. Т.е. Эмили + Энди = 1.

Я подумал, что, возможно, смогу преобразовать строки в массивы символов и использовать два оператора For внутри друг друга, чтобы просмотреть каждую возможность, но я не на 100% уверен в том, как я это сделаю. Я искал Google для ответа, но я никуда не доберусь.

Я прошу прощения за то, что не предоставил никакой код, у меня в настоящее время нет никакой Я довольно новичок в Java и не знаю, как это сделать.

У кого-нибудь есть решение?

Ответы [ 8 ]

3 голосов
/ 21 марта 2012

Сначала вы должны удалить дубликаты букв в обеих строках, а затем сравнить.Приведенный ниже код работает нормально.

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

1 голос
/ 21 марта 2012
    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 !!

1 голос
/ 21 марта 2012

Это определенно звучит как домашнее задание ... Но если это не так, я бы решил это путем преобразования строк в массивы символов и написания вложенного цикла for, который сравнивает каждый символ и увеличивает счетчик при обнаружении совпадения.Если вы будете считать каждую букву только один раз, алгоритм изменится немного.

1 голос
/ 21 марта 2012

Вы можете преобразовать каждую строку в набор, а затем выполнить пересечение набора, чтобы выяснить, как могут быть общие символы. Это может быть легче понять.

0 голосов
/ 21 марта 2012

Вы можете использовать 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);



    }

    }
0 голосов
/ 21 марта 2012

Это выглядит как домашнее задание.

Традиционный подход, который применяется в большинстве языков:

  1. преобразование строк в массивы символов
  2. сортировка массивовв порядке возрастания
  3. при необходимости удалите дубликаты, используя фиктивное значение и прибегнув к ним, или перетасуйте их, это одна из причин сортировки
  4. итерации по массивам в одном цикле while,используя i и j:
    , когда a [i]> b [j], приращение j,когда a [i] выйти из цикла, когда один массив исчерпан, i> последний элемент a или b>последний элемент b

Готово

0 голосов
/ 21 марта 2012

Метод ниже напечатает общий символ в двух разных строках.

   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 голосов
/ 21 марта 2012

Вы можете выполнить итерацию по первой строке, поместив каждый символ в качестве ключа в Hashtable со значением 0.

Итерация по второй строке и, если символ находится в хеш-таблице, заменить его значение на 1.

Переберите хеш-таблицу и добавьте свои значения.

...