2015-04-03 6 views
0

У меня есть функция counter(string s1, string s2), которая в качестве параметров принимает две строки (оба размера 4). s1 генерируется случайным образом, а s2 вводит пользователя.C++ Проверка дубликатов в строке

int counter(string s1, string s2){ 
    int count = 0; 
    int i, j; 
    if(i != j){ 
     for(i = 0; i < 4; i++){ 
      for(j = 0; j < 4; j++){ 
       if(s2[i] != s2[j] && s2[j] == s1[i]){ 
         count += 1; 
       } 
      } 
     } 
    } 
    return count; 
} 

Что делает эта функция сравнить каждый элемент s2 к s1 «с. Если элемент s2 равен элементу s1, при условии, что они не имеют того же индекса или позиции, count увеличивается на 1. Функция, однако, сталкивается с проблемами, когда s2 содержит дубликаты. Например, если s1 = 1234 и s2 = 4445, выход должен быть 1, но моя программа выдает 3. Как я могу обнаружить дубликаты в строке?

Забыл упомянуть об этом, но s1 (случайно сгенерированная строка) имеет различные символы.

+0

Каково предполагаемое поведение? Можете ли вы привести несколько примеров ввода и того, что вы ожидаете от вывода? – bdonlan

+0

error: 's1' не был объявлен в этой области –

+0

'if (i! = J)' всегда false –

ответ

0

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

int counter(string s1, string s2){ 
    int count = 0; 
    int i, j; 
     for(i = 0; i < 4; i++){ 
      for(j = 0; j < 4; j++){ 
       if(i != j){ 
        if(s2[j] == s1[i]){ 
          count += 1; 
          break;  // Break out of inner for-loop 
             // to avoid counting letters twice 
        } 
       } 
      } 
     } 
    return count; 
} 

Однако, я не уверен, что вы хотите, чтобы программа делать в случае, если та же буква присутствует в S1 несколько раз.

EDIT: После прочтения некоторых уточнений в комментариях, если-заявление должно быть

if(s2[i] != s2[j] && s2[j] == s1[i]){ 

как в оригинальном сообщении.

+0

Возможно, я не упомянул об этом, но s1 имеет разные символы. – Bargain23

+0

Итак 's1 =" 1212 ";' является незаконным вводом, который не требуется обрабатывать программе. Правильно? – 4386427

+0

Да. Я позаботился об этом с помощью функции, которая генерирует случайную строку. – Bargain23

0

Смею предложить. Но я сломал мозг ваш вопрос =)

int counter(string s1, string s2){ 
    int count = 0; 
    for(int i = 0; i < s1.length(); ++i) 
    { 
     string::size_type loc = s2.find(s1[i], 0); 
     while (loc != string::npos) 
     { 
      if(loc != i) 
       ++count; 
      loc = s2.find(s1[i], loc + 1); 
     } 
    } 
    return count; 
} 
0

добавить, если условие внутри для цикла,

int counter(string s1, string s2){ 
     int count = 0; 
     int i, j; 
     for(i = 0; i < 4; i++){ 
       for(j = 0; j < 4; j++){ 
        if(i!=j && s2[j] == s1[i]){ 
          count += 1; 
        } 
       } 
      } 
     } 
     return count; 
    } 
0

Вы можете обнаружить повторяющиеся элементы, используя Levenshtein distance Алгоритмы.

int levenshtein(const char *s, int ls, const char *t, int lt){ 
    int a, b, c; 

    /* if either string is empty, difference is inserting all chars 
    * from the other 
    */ 
    if (!ls) return lt; 
    if (!lt) return ls; 

    /* if last letters are the same, the difference is whatever is 
    * required to edit the rest of the strings 
    */ 
    if (s[ls] == t[ls]) 
      return levenshtein(s, ls - 1, t, lt - 1); 

    /* else try: 
    *  changing last letter of s to that of t; or 
    *  remove last letter of s; or 
    *  remove last letter of t, 
    * any of which is 1 edit plus editing the rest of the strings 
    */ 
    a = levenshtein(s, ls - 1, t, lt - 1); 
    b = levenshtein(s, ls,  t, lt - 1); 
    c = levenshtein(s, ls - 1, t, lt ); 

    if (a > b) a = b; 
    if (a > c) a = c; 
    return a + 1;} 
Смежные вопросы