2015-03-27 4 views
2

Я пытаюсь найти самые длинные повторяющиеся подпоследовательности смежных символов из строки.Найти длину самой длинной непрерывной подпоследовательности того же характер

public int longestRep(String str) { 

} 

При вызове метода с

longestRep("ccbbbaaaaddaa"); //Should return 4 

код, который я использовал до сих пор есть;

public static int longestRep(String str) 
{ 
    int currLen = 1; // Current length of contiguous chars being held in str 
    char currLet = ' '; // Current Letter *NOT NEEDED FOR CODINGBAT 
    char maxLet = ' '; // Maximum length letter *NOT NEEDED FOR CODINGBAT 
    int maxLen = 0; // Maximum length of contiguous chars being held in str 
    //int maxCount = 0; // Highest count of contiguous chars being held in str 
    int currPos = 0; // Track where in str we are at 
    int strLen = str.length(); // Length of str; 
    for(currPos = 0; currPos < strLen -1 ; currPos++) 
    { 
     currLet = str.charAt(currPos); 
     //System.out.println("Curr char: "+currLet+" Next Char: "+str.charAt(currPos+1)); 
     if(currLet == str.charAt(currPos+1)) 
     { 
      currLen++; 
     } 
     if(currLen > maxLen) 
     { 
      maxLen = currLen; 
      //System.out.println("Max len: "+maxLen+" Curr Len: "+currLen); 
      //maxLet = currLet; 
      currLen = 1; 
     } 
     boolean atBeginning = true; 
     if(currPos == 0) 
     { 
      atBeginning = true; 
     } 
     else if(currPos != 0) 
     { 
      atBeginning = false; 
     } 
     if(atBeginning == false) //if not at the beginning of the string 
     { 
      if(currLet != str.charAt(currPos+1) && currLet == str.charAt(currPos-1)) 
      { 
       currLen++; 
      } 
     } 
     if(currLen > maxLen) 
     { 
      maxLen = currLen; 
      currLen = 1; 
     } 
    } 

    return maxLen; 
    } 
public static void main(String args[]) 
{ 
    int result = longestRep("abcdeeefeeeefppppppp"); 
    System.out.println(result); 
} 

Однако, я получаю недействительные ответы и не знаю, что я сделал неправильно. Я новичок в Java и очень признателен за любую помощь, которую я могу получить! Часть коды я только проданной и может/не может быть использован.

+3

Определить '' недопустимые ответы ''пожалуйста. –

+0

[поиск Stackoverflow: Java длинная последовательность] (http://stackoverflow.com/search?q=%5Bjava%5D+longest+sequence+) –

+0

вы можете инициализировать atBeginning так: булевы atBeginning = (currPos == 0); или еще лучше вы могли бы просто избавиться от него вообще и использовать, если вместо того, если (atBeginning == ложь) – samgak

ответ

1

Я не могу сделать головы, ни хвосты любой вещи после boolean atBeginning = true; и, честно говоря, это, кажется, не требуется ...

Yo ур основная логика должна следовать что-то вроде ...

if character_at_current_position is equal to next_character then 
    currLen = currLen + 1 
else if currLen is greater then maxLen then 
    maxLen = currLen 
    currLen = 1 
else currLen = 1 

Кроме того, необходимо будет выполнить еще одну проверку на currLen is greater then maxLen вне цикла для учета любых изменений последний символ может сделать

Больше похоже ...

for (currPos = 0; currPos < strLen - 1; currPos++) { 
    currLet = str.charAt(currPos); 
    //System.out.println("Curr char: "+currLet+" Next Char: "+str.charAt(currPos+1)); 
    if (currLet == str.charAt(currPos + 1)) { 
     currLen++; 
    } else if (currLen > maxLen) { 
     maxLen = currLen; 
     currLen = 1; 
    } else { 
     currLen = 1; 
    } 
} 
if (currLen > maxLen) { 
    maxLen = currLen; 
} 

Таким образом, используя

System.out.println(longestRep("ccccccaaaabbbbb")); // 6 c's 
System.out.println(longestRep("ccbbbaaaaddaa")); // 4 a's 
System.out.println(longestRep("abcdeeefeeeeeeeefppppppp")); // 8 e's 

я ...

6 
4 
8 
1

Try:

public int longestRep(String s){ 
    char[] c = s.toCharArray(); 
    int amt = 0; 
    char current; 
    int max=0; 

    for(int i = 0; i < c.length; i ++){ 
     if(current == c[i]) 
      amt ++; 
     else{ 

      amt = 1; 
      current = c[i]; 
     } 
     if (max < amt) 
       max=amt; 
    } 

    return max; 
} 

Это итерация вашей строки и проверить, если символ в i то же самое, что и текущий характер, если он добавит к amt или иначе он будет установлен током что char и установить amt к 1.

+0

бы вы сейчас вроде для поставки версии, которая компилируется и работает ... – MadProgrammer

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