2017-01-26 10 views
2

Я пытаюсь получить самую повторяющуюся последовательность символов в строке. Например:Максимальная повторяющаяся последовательность, а не самая длинная повторяющаяся последовательность

Вход:

s = "abccbaabccba" 

Выход:

2 

Я использовал динамическое программирование, чтобы выяснить, повторяющуюся последовательность, но это возвращает самую длинную повторяющуюся последовательность символов , Например:

ввода:

s = "abcabcabcabc" 

Выход:

2 
2(abcabc,abcabc) instead of 4(abc,abc,abc,abc) 

Вот часть кода, где я заполняющего таблицу DP и экстрагирующей повторяющуюся последовательность. Может ли кто-нибудь предложить, как я могу получить самую повторяющуюся последовательность?

//Run through the string and fill the DP table. 
     char[] chars = s.toCharArray(); 
     for(int i = 1; i <= length; i++){ 
      for(int j = 1; j <= length; j++){ 
       if(chars[i-1] == chars[j-1] && Math.abs(i-j) > table[i-1][j-1]){ 
        table[i][j] = table[i-1][j-1] + 1; 
        if(table[i][j] > max_length_sub){ 
         max_length_sub = table[i][j]; 
         array_index = Math.min(i, j); 
        } 
       }else{ 
        table[i][j] = 0; 
       } 
      }    
     }  
     //Check if there was a repeating sequence and return the number of times it occurred. 
     if(max_length_sub > 0){ 
      String temp = s; 
      String subSeq = ""; 
      for(int i = (array_index - max_length_sub); i< max_length_sub; i++){ 
       subSeq = subSeq + s.charAt(i); 
      } 
      System.out.println(subSeq); 
      Pattern pattern = Pattern.compile(subSeq); 
      Matcher matcher = pattern.matcher(s); 
      int count = 0; 
      while (matcher.find()) 
       count++; 

      // To find left overs - doesn't seem to matter 
      String[] splits = temp.split(subSeq); 
      if (splits.length == 0){ 
       return count; 
      }else{ 
       return 0; 
      } 
     } 
+0

Я предполагаю, что это задание. Нужно ли ** ** использовать DP для решения? вы разрешили сборники Java? –

+0

Да! Мы не обязаны использовать DP. И да, я могу использовать коллекции java. –

ответ

1

Простой и свалка, то наименьшая последовательность будет рассмотрен пара символов (*):

  • цикл по всей строки получить каждую последовательную пару символов, как с помощью for и substring, чтобы получить символы;
  • считать появление этой пары в строке, создать метод countOccurrences() с использованием indexof(String, int) или регулярных выражений; и
  • магазин самый большой граф, использовать одну переменную maxCount вне цикла и if, чтобы проверить, если фактический отсчет больше (или Math.max())

(*), если «ABC» происходит в 5 раз, чем " аб»(и„БК“) будет происходить по крайней мере в 5 раз тоже - так что это достаточно, чтобы искать только для„AB“и„нашей эры“, не нужно проверять„абв“

Редактировать без остатков, см комментарии, резюме:

  • проверить, если первый символ повторяется через всю строку, если не

  • проверить, если 2 начальные символы повторяются во всем, если не

  • проверить, если в 3 ...

Требуется не менее 2 счетчиков/петель: один для количества символов для проверки, второй для проверяемой позиции. Для повышения производительности можно использовать некоторую арифметику: длина строки должна быть делящейся на количество повторяющихся символов без остатка.

+0

На самом деле, я опубликовал половину проблемы. Позвольте мне решить проблему. «Торт круглый и украшен M & M по кругу вокруг края. Но пока остальная часть пирога одинаковая, M & M не являются: есть несколько цветов, и каждый миньон должен получить точно такую ​​же последовательность M & M. также хотите, чтобы вы могли обслуживать весь торт. Чтобы помочь вам лучше всего разрезать торт, вы превратили последовательность цветов M & M на торт в строку: каждая возможная буква (между а и z) соответствует уникальной цвет." –

+0

«Напишите функцию, называемую ответом (ответами), которая, учитывая непустую строку длиной менее 200 символов, описывающую последовательность M & M, возвращает максимальное количество равных частей, которые можно вырезать из торта, не оставляя остатков». - Это полная постановка задачи. –

+0

Я не знаю, проведет ли проверка пары последовательностей для этой проблемы! –

 Смежные вопросы

  • Нет связанных вопросов^_^