#java #строки
Нужно определить является ли строка палиндромом. Палиндромом называется строка, которая пишется одинаково слева направо и справа налево (в том числе пустая). При определении "палиндромности" строки должны учитываться только буквы и цифры. А пробелы, знаки препинания, а также регистр символов должны игнорироваться. Sample Input: Madam, I'm Adam! Sample Output: true убрать пробелы можно с помощью .replace(" ",""); а как отфильтровать строку от знаков препинания? общий код который работает на строки без знаков препинания: import java.util.Arrays; public class Arr { public Boolean vozvrat(String A){ String B=""; String C=A.replace(" ",""); char[] mass =C.toCharArray(); char[] mass2=new char[mass.length]; for ( int i =mass.length-1; i>= 0;){ for(int j=0;jОтветы
Ответ 1
Метод определяет является ли строка палиндромом. Решение в одну строчку. replaceAll("\\W",""): убираем из строки все не нужные символы (знаки препинания, пробелы и т.д.); new StringBuilder: создаем вторую строку, но пересортированную в обратном порядке с помощью метода reverse(); equalsIgnoreCase: сравниваем их между собой, игнорируя регистр. Код: public static boolean isPalindrome(String text) { return text.replaceAll("\\W","") .equalsIgnoreCase(new StringBuilder(text.replaceAll("\\W","")) .reverse().toString()); }Ответ 2
Вот решение Вашей проблемы: import java.util.regex.*; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { public static void main(String[] args) { BufferedReader inputStream = new BufferedReader(new InputStreamReader(System.in)); try { System.out.print("Sample input: "); String input = inputStream.readLine(); System.out.print("Sample output: "); System.out.print(isPalindrome(input)); } catch (IOException exception) { System.err.println("Input error"); } } public static boolean isPalindrome(String input) { Pattern pattern = Pattern.compile("\\w+"); Matcher matcher = pattern.matcher(input); StringBuilder builder = new StringBuilder(); while (matcher.find()) builder.append(matcher.group()); String result = builder.toString(); String reverseResult = builder.reverse().toString(); if(result.compareToIgnoreCase(reverseResult) == 0) return true; return false; } } UPD: немного не учёл Ваш код, можете в vozvrat скопировать мой метод isPalindrome.Ответ 3
спасибо Alexander Smirnov но так более понятней будет public static boolean isPalindrome(String text) { text = text.replaceAll("\\W","");//удаляем все ненужное StringBuilder strBuilder = new StringBuilder(text); strBuilder.reverse(); //переворачиваем строку String invertedText = strBuilder.toString();//присваиваем перевернутую строку return text.equalsIgnoreCase(invertedText) ;//возвращаем сравнение двух строк вне зависимости от регистра }Ответ 4
Составьте регулярку, включающую только буквы и цифры. Разбейте строку на массив. В цикле пробегитесь по массиву, проверяя на условие вхождения в регулярку. Если не входит, заменяйте на "". В итоге у вас на выходе строка без пробелов и знаков препинания.Ответ 5
спасибо, вот еще сделал, немного калично но тоже работает import java.util.Arrays; public class Arr { public Boolean vozvrat(String A) { String K = ""; String B = ""; char[] mass0 = A.toCharArray(); for (int l = 0; l < mass0.length - 1; l++) { if (Character.isLetterOrDigit(mass0[l]) == false) { l++; } K += mass0[l]; } K = K.replace(" ", ""); char[] mass = K.toCharArray(); char[] mass2 = new char[mass.length]; for (int i = mass.length - 1; i >= 0;) { for (int j = 0; j < mass2.length; j++) { mass2[j] = mass[i]; i--; B += mass2[j]; } } System.out.println(A); System.out.println(K); System.out.println(B); return B.equalsIgnoreCase(K); } public static void main(String args[]) { Arr C = new Arr(); System.out.println(C.vozvrat("Madam, I'm Adam!")); } }
Комментариев нет:
Отправить комментарий