2014-02-13 4 views
4

Следующее - это то, что я делаю, но я не нашел правильного ответа.Как вернуть длинную последовательность символов в строке в java?

Пример. Если у меня есть последовательность «hellloo», выход будет «lll». Скажите, пожалуйста, что не так?

public class LongestSequenceOfChar { 
    static String testcase1="hellloo"; 

    public static void main(String[] args) { 
     LongestSequenceOfChar test = new LongestSequenceOfChar(); 
     String result = test.longestSequenceOfChar(testcase1); 
     System.out.println(result); 
    } 
    public String longestSequenceOfChar(String str){ 
     String result=""; 
     for(int i=0;i<str.length();i++){ 
      char ch=str.charAt(i); 
      for(int j=i+1;j<str.length();j++){ 
       char ch1=str.charAt(j); 
       if(ch!=ch1){ 
        continue; 
       } 
       result+=ch; 
      } 
     } 
     return result; 
    } 
} 
+0

Как отметил Сотириос, изучение отладки для таких задач очень полезно. Просто поставьте точку останова в начале вашего метода и проверьте шаг за шагом, что происходит с результатом. –

+0

Я новичок в java. Я ожидаю, что не буду использовать функции. Я должен сделать это только с помощью цикла. Пожалуйста, помогите. –

ответ

2

Если есть три 'l', вы добавляете только два, а на следующем шаге - два 'l', и вы добавляете один из них. Тогда то же самое с двумя «o», где вы добавляете один. Вам нужно только очистить строку результата, когда вы переходите к следующей букве и перед тем, как сохранить результат в другой переменной, но только если она длиннее!

public String longestSequenceOfChar(String str){ 
    String interimresult=""; 
    String result="";    //final result 
    for(int i=0;i<str.length();i++){ 
     char ch=str.charAt(i); 
     interimresult += ch;  //add the letter once 
     for(int j=i+1;j<str.length();j++){ 
      char ch1=str.charAt(j); 
      if(ch!=ch1){ 
       break; 
      } 
      interimresult +=ch; 
     } 
     if(interimresult.length()>result.length())//store the result if it is longer 
      result = interimresult; 
     interimresult = "";     //clear to continue with the next letter 
    } 
    return result; 
} 
+0

Большое вам спасибо за помощь.Я нашел свою ошибку @kai –

+0

, ваш код возвращает самый распространенный символ в строке, но мне нужно найти самую длинную последовательность символов. Например, если строка «Давление», то выход будет «ss», но он дает выход «rr». –

+0

теперь это работает, но это была такая небольшая ошибка, что вы можете найти ее сами. вам нужно только изменить, чтобы продолжить разрыв. – kai

5

У вас должен быть счетчик, на который рассчитывается номер самой длинной последовательности. Когда вы найдете более длинную последовательность, вы должны сбросить result и соответственно обновить счетчик.

Однако, вы можете иметь лучшие решения:

  • Есть массив размера 26 (размер английского алфавита). Теперь вы перебираете строку и для каждого char в ней вы добавляете 1 в соответствующую ячейку в вспомогательном массиве.
  • Используйте HashMap, который имеет char в виде ключ и номер он появляется в качестве значения. Если это новый char, вы просто поместите с 0 значением, если оно существует, вы увеличиваете существующее значение .

Совет. Используйте отладчик, это может спасти вам жизнь.

+1

Я собирался предложить более подход к ООП. Имейте класс 'Letter' со значением и частотой. Это обеспечивает некоторое прямое отображение и может сделать более чистый код. Только комментируя, чтобы дать OP другой угол. – christopher

3
1. Create a HashMap<Character,Integer>.. Integer-->count 
2. Start from the beginning of your String.. For each character, check if it is already present in the hashmap 
    a. If Yes, just increment the count 
    b. if No, then add the character as key to the Map and set its count value to 1. 
+0

Так как я новичок в java.I не знаю о Hashmap и его использовании? Любые простые решения помогут. –

+0

@ user3305143 - Возможно, это проще, чем ваш подход ... :) .. Это сделает 5-6 строк кода. – TheLostMind

2

Вот решение:

public String longestSequenceOfChar(String str) { 
    String result = ""; 

    for (int i = 0; i < str.length(); i++) { 
     int j = i; 
     while(j < str.length() && str.charAt(j) == str.charAt(i)) { 
      j++; 
     } 

     // If this one is longer than previous, then asign it to result. 
     if(j - i > result.length()) { 
      result = str.substring(i, j); 
     } 
    } 
    return result; 
} 
+0

Спасибо, что помогли мне с этой проблемой @ashot –

+0

приветствую вас @ user3305143, это было интересно для меня –

+0

@ user3305143, BTW более эффективный «патч» :) remove 'i ++' из цикла for и после 'if {}' (вне if) добавить 'i = j'; –

0

Попробуйте это ...

public class HelloWorld { 

    public static void main(String[] args) { 
     System.out.println(maxLen(null)); 
     System.out.println(maxLen("")); 
     System.out.println(maxLen("a")); 
     System.out.println(maxLen("aa")); 
     System.out.println(maxLen("abcddd")); 
     System.out.println(maxLen("abcd")); 
     System.out.println(maxLen("aabbba")); 
    } 

    public static String maxLen(String input) { 
     // Avoid NPEs 
     if (input == null) { 
      return null; 
     } 
     int maxLen = 0; 
     int tempLen = 0; 
     char prevChar = 0; 
     char c = 0; 
     char repeatChar = 0; 
     for (int i = 0; i < input.length(); i++) { 
      c = input.charAt(i); 
      if (c == prevChar) { 
       tempLen++; 
       if (tempLen > maxLen) 
        repeatChar = c; 
      } else { 
       maxLen = (tempLen > maxLen) ? tempLen : maxLen; 
       prevChar = c; 
       tempLen = 1; 
      } 
     } 
     maxLen = (tempLen > maxLen) ? tempLen : maxLen; 
     if (maxLen == 0 || maxLen == 1) 
      return "no sequence found"; 
     else { 
      String str = ""; 
      for (int i = 1; i <= maxLen; i++) 
       str += String.valueOf(repeatChar); 
      return str; 
     } 
    } 
} 

Это будет пройти все тестовые случаи.

1

Это можно легко решить с помощью HashMap. Заказ этот пример кода:

import java.util.Collections; 
import java.util.HashMap; 
import java.util.Map; 
import java.util.Map.Entry; 

public class MaximumOccuringCharUsingHashMap { 
    public static void main(String[] args) { 
    String test = "test samples"; 
    MaximumOccuringCharUsingHashMap mc = 
     new MaximumOccuringCharUsingHashMap(); 
    System.out.println(mc.findMaximunOccurenceCharacter(test)); 
} 
    char findMaximunOccurenceCharacter(String input){ 
     Map<Character, Integer> countHash = 
      new HashMap<Character, Integer>(); 
     for(int i=0; i<input.length() ;i++){ 
      char currentChar = input.charAt(i); 
      if(countHash.get(currentChar)==null){ 
       countHash.put(currentChar, 1); 
      }else{ 
       countHash. 
       put(currentChar, countHash.get(currentChar)+1); 
      } 
     } 

     int max = Collections.max(countHash.values()); 

     char maxCharacter =0; 
     for(Entry<Character, Integer> entry :countHash.entrySet()){ 
      if(entry.getValue() == max){ 
       maxCharacter = entry.getKey(); 
      } 
     } 
     return maxCharacter; 
    } 
} 

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

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