2016-01-07 5 views
-6

Так что я недавно попал в колледж, и я сделал довольно хорошо, это привело к тому, что я присоединился к конкурсу программирования.Палиндром: Игнорирование пробелов, футляров, специальных символов

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

Пример: Ma ...... Я: Palindrome нет .... черт ..., .'.... жил ...... на

Я попробовал мой лучше ответить на это, даже после соревнований. Мне удалось пройти его и получил квалификацию для следующего раунда, но эта задача заставила меня кошмары в течение ночи лол

+3

Где ваш вопрос? –

+0

@JohnHascall Он говорит, что «мне удалось передать его», по-видимому, он уже написал код для этого. Это не то же самое, что «я все еще в недоумении, как это сделать». –

+0

Я принимал это, когда он проходил соревнование, но не этот вопрос, но что угодно –

ответ

0

Я хотел бы подойти к этой проблеме, как этот псевдо-код:

letters <== "" 

characterEntered (letters, c) { 
    if (c is an uppercase letter) lowercase(c) 
    if (c is a letter) append c to letters 
    /* otherwise forget about it */ 
} 

allCharactersEntered (list) { 
    backwards <== reverse(letters) 
    if (backwards equals letters) say "Palindrome" 
    else say "Nope" 
} 
0

Java Версия:

public static void main(String[] args) { 

    palin(); 
} 

public static void palin() { 

    String in = null; 
    // loop 
    while (true) { 
     // read input 
     in = readInput(); 
     // check input 
     if ("q".equalsIgnoreCase(in)) { 
      // exit 
      break; 
     } 
     if (checkPalindrome(in)) { 
      System.out.println("Pass"); 
     } else { 
      System.out.println("Fail"); 
     } 

    } 

} 

private static boolean checkPalindrome(String in) { 
    String sanitizedIn = sanitize(in); 

    return sanitizedIn.equalsIgnoreCase(StringUtils.reverse(sanitizedIn)); 
} 

private static String sanitize(String in) { 
    String result = null; 

    Pattern p = Pattern.compile("[^a-zA-Z0-9]+"); 
    Matcher m = p.matcher(in); 
    result = m.replaceAll(""); 
    System.out.println(in + "|>>>>>|" + result); 
    return result; 
} 

private static String readInput() { 

    try { 
     System.out.println("Enter text(q to Quit):"); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); 
     return reader.readLine(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     return null; 
    } 
} 

}

0

Вот более эффективное решение

private boolean isPalindrome(String text) { 
    int index1 = 0; 
    int index2 = text.length() - 1; 
    char[] chars = text.toCharArray(); 
    if (!Character.isLetter(chars[index1])) { 
     index1 = nextLetterIndex(chars, index1); 
    } 
    if (!Character.isLetter(chars[index2])) { 
     index2 = previousLetterIndex(chars, index2); 
    } 
    while (index2 >= index1) { 
     if (Character.toLowerCase(chars[index1]) != Character.toLowerCase(chars[index2])) { 
     return false; 
     } 

     index1 = nextLetterIndex(chars, index1); 
     index2 = previousLetterIndex(chars, index2); 
    } 

    return true; 
    } 

    int previousLetterIndex(char[] chars, int index) { 
    index--; 
    while (!Character.isLetter(chars[index])) { 
     index--; 
    } 
    return index; 
    } 

    int nextLetterIndex(char[] chars, int index) { 
    index++; 
    while (!Character.isLetter(chars[index])) { 
     index++; 
    } 
    return index; 
    } 
Смежные вопросы