Страницы

Поиск по вопросам

четверг, 12 декабря 2019 г.

Является ли строка палиндромом(пишется одинаково в обе стороны)

#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!")); } }

Комментариев нет:

Отправить комментарий