#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!"));
}
}
Комментариев нет:
Отправить комментарий