palindrome 문자열 확인
회문(palindrome)은 단어, 구, 숫자 또는 어느 방향으로든 같은 방식으로 읽을 수 있는 다른 일련의 단위입니다.
단어가 회문인지 확인하기 위해 단어의 문자 배열을 가져와 문자를 비교합니다.테스트해 봤는데 효과가 있는 것 같아요.하지만 그것이 맞는지, 개선해야 할 점이 있는지 알고 싶습니다.
코드는 다음과 같습니다.
public class Aufg1 {
public static void main(String[] args) {
String wort = "reliefpfpfeiller";
char[] warray = wort.toCharArray();
System.out.println(istPalindrom(warray));
}
public static boolean istPalindrom(char[] wort){
boolean palindrom = false;
if(wort.length%2 == 0){
for(int i = 0; i < wort.length/2-1; i++){
if(wort[i] != wort[wort.length-i-1]){
return false;
}else{
palindrom = true;
}
}
}else{
for(int i = 0; i < (wort.length-1)/2-1; i++){
if(wort[i] != wort[wort.length-i-1]){
return false;
}else{
palindrom = true;
}
}
}
return palindrom;
}
}
왜 그냥 안 돼?
public static boolean istPalindrom(char[] word){
int i1 = 0;
int i2 = word.length - 1;
while (i2 > i1) {
if (word[i1] != word[i2]) {
return false;
}
++i1;
--i2;
}
return true;
}
예:
입력은 "andna"입니다.
i1은 0, i2는 4가 됩니다.
첫 번째 루프 반복을 비교합니다.word[0]
그리고.word[4]
같은 값이기 때문에 i1(현재는 1)과 i2(현재는 3)를 증가시킵니다.
그러면 n을 비교해 보겠습니다.같은 값이기 때문에 i1(지금은 2)과 i2(지금은 2)를 증가시킵니다.
여기서 i1과 i2는 같기 때문에(둘 다 2), while loop의 조건은 true가 아니기 때문에 루프가 종료되고 true가 반환됩니다.
문자열이 Palindrome인지 아닌지는 문자열의 반대와 비교하여 확인할 수 있습니다.
public static boolean isPalindrome(String str) {
return str.equals(new StringBuilder(str).reverse().toString());
}
또는 1.5 이전 버전의 Java의 경우,
public static boolean isPalindrome(String str) {
return str.equals(new StringBuffer().append(str).reverse().toString());
}
편집: @FernandoPelliccioni는 시간과 공간의 측면에서 이 솔루션의 효율성(또는 그 결여)을 매우 철저하게 분석했습니다.이 질문의 계산 복잡성 및 기타 가능한 솔루션에 관심이 있는 경우 읽어보십시오.
다수의 오브젝트를 (비효율적으로) 초기화하지 않는 간결한 버전:
boolean isPalindrome(String str) {
int n = str.length();
for( int i = 0; i < n/2; i++ )
if (str.charAt(i) != str.charAt(n-i-1)) return false;
return true;
}
또는 재귀입니다.
보다 짧은 재귀적 솔루션을 찾고 있는 사용자는 특정 문자열이 회문으로서 충족되는지 여부를 확인하려면 다음 절차를 따릅니다.
private boolean isPalindrome(String s) {
int length = s.length();
if (length < 2) // If the string only has 1 char or is empty
return true;
else {
// Check opposite ends of the string for equality
if (s.charAt(0) != s.charAt(length - 1))
return false;
// Function call for string with the two ends snipped off
else
return isPalindrome(s.substring(1, length - 1));
}
}
원하는 경우 더 짧을 수도 있습니다.
private boolean isPalindrome(String s) {
int length = s.length();
if (length < 2) return true;
return s.charAt(0) != s.charAt(length - 1) ? false :
isPalindrome(s.substring(1, length - 1));
}
이동, Java:
public boolean isPalindrome (String word) {
String myWord = word.replaceAll("\\s+","");
String reverse = new StringBuffer(myWord).reverse().toString();
return reverse.equalsIgnoreCase(myWord);
}
isPalindrome("Never Odd or Even"); // True
isPalindrome("Never Odd or Even1"); // False
또, 다른 외관의 솔루션:
public static boolean isPalindrome(String s) {
for (int i=0 , j=s.length()-1 ; i<j ; i++ , j-- ) {
if ( s.charAt(i) != s.charAt(j) ) {
return false;
}
}
return true;
}
완전한 Java 8 스트리밍 솔루션을 소개합니다.IntStream은 문자열의 절반 길이까지 모든 인덱스를 제공한 후 시작과 끝을 비교합니다.
public static void main(String[] args) {
for (String testStr : Arrays.asList("testset", "none", "andna", "haah", "habh", "haaah")) {
System.out.println("testing " + testStr + " is palindrome=" + isPalindrome(testStr));
}
}
public static boolean isPalindrome(String str) {
return IntStream.range(0, str.length() / 2)
.noneMatch(i -> str.charAt(i) != str.charAt(str.length() - i - 1));
}
출력:
testing testset is palindrome=true
testing none is palindrome=false
testing andna is palindrome=true
testing haah is palindrome=true
testing habh is palindrome=false
testing haaah is palindrome=true
public class Palindromes {
public static void main(String[] args) {
String word = "reliefpfpfeiller";
char[] warray = word.toCharArray();
System.out.println(isPalindrome(warray));
}
public static boolean isPalindrome(char[] word){
if(word.length%2 == 0){
for(int i = 0; i < word.length/2-1; i++){
if(word[i] != word[word.length-i-1]){
return false;
}
}
}else{
for(int i = 0; i < (word.length-1)/2-1; i++){
if(word[i] != word[word.length-i-1]){
return false;
}
}
}
return true;
}
}
public class palindrome {
public static void main(String[] args) {
StringBuffer strBuf1 = new StringBuffer("malayalam");
StringBuffer strBuf2 = new StringBuffer("malayalam");
strBuf2.reverse();
System.out.println(strBuf2);
System.out.println((strBuf1.toString()).equals(strBuf2.toString()));
if ((strBuf1.toString()).equals(strBuf2.toString()))
System.out.println("palindrome");
else
System.out.println("not a palindrome");
}
}
나는 이 질문의 중복으로 표시된 질문에 대한 해결책을 찾았다.차라리 여기에 던져버리는게 낫겠다...
이 질문은 이것을 해결하기 위해 한 줄을 요구했고, 나는 그것을 문학적 회문으로서 더 많이 받아들였다 - 그래서 공백, 구두점, 대/소문자가 결과를 벗어 날 수 있다.
다음은 소규모 테스트 클래스로 구성된 추악한 솔루션입니다.
public class Palindrome {
public static boolean isPalendrome(String arg) {
return arg.replaceAll("[^A-Za-z]", "").equalsIgnoreCase(new StringBuilder(arg).reverse().toString().replaceAll("[^A-Za-z]", ""));
}
public static void main(String[] args) {
System.out.println(isPalendrome("hiya"));
System.out.println(isPalendrome("star buttons not tub rats"));
System.out.println(isPalendrome("stab nail at ill Italian bats!"));
return;
}
}
좀 심술궂게 굴어서 미안하지만, 다른 질문에는 원라이너가 명시되어 있다.
나머지 부분과 함께 palindrome을 체크하는 경우, 이 경우 공백이 제거되는 것으로 가정합니다.
public int isPalindrome(String a) {
//Remove all spaces and non alpha characters
String ab = a.replaceAll("[^A-Za-z0-9]", "").toLowerCase();
//System.out.println(ab);
for (int i=0; i<ab.length()/2; i++) {
if(ab.charAt(i) != ab.charAt((ab.length()-1)-i)) {
return 0;
}
}
return 1;
}
저는 java를 처음 접하는 사람이고, 당신의 질문을 제 지식을 향상시키기 위한 도전으로 받아들입니다.
import java.util.ArrayList;
import java.util.List;
public class PalindromeRecursiveBoolean {
public static boolean isPalindrome(String str) {
str = str.toUpperCase();
char[] strChars = str.toCharArray();
List<Character> word = new ArrayList<>();
for (char c : strChars) {
word.add(c);
}
while (true) {
if ((word.size() == 1) || (word.size() == 0)) {
return true;
}
if (word.get(0) == word.get(word.size() - 1)) {
word.remove(0);
word.remove(word.size() - 1);
} else {
return false;
}
}
}
}
- 문자열이 문자가 없거나 한 글자만 있으면 회문입니다.
- 그렇지 않으면 문자열의 첫 글자와 마지막 글자를 비교합니다.
- 첫 글자와 마지막 글자가 다를 경우 문자열은 회문이 아닙니다.
- 그렇지 않으면 첫 글자와 마지막 글자가 동일합니다.문자열에서 해당 문자열을 제거하고 남은 문자열이 회문인지 확인합니다.이 작은 문자열에 대한 답을 가져와서 원래 문자열에 대한 답변으로 사용하고 1부터 반복합니다.
이것을 시험해 보세요.
import java.util.*;
public class str {
public static void main(String args[])
{
Scanner in=new Scanner(System.in);
System.out.println("ENTER YOUR STRING: ");
String a=in.nextLine();
System.out.println("GIVEN STRING IS: "+a);
StringBuffer str=new StringBuffer(a);
StringBuffer str2=new StringBuffer(str.reverse());
String s2=new String(str2);
System.out.println("THE REVERSED STRING IS: "+str2);
if(a.equals(s2))
System.out.println("ITS A PALINDROME");
else
System.out.println("ITS NOT A PALINDROME");
}
}
public boolean isPalindrome(String abc){
if(abc != null && abc.length() > 0){
char[] arr = abc.toCharArray();
for (int i = 0; i < arr.length/2; i++) {
if(arr[i] != arr[arr.length - 1 - i]){
return false;
}
}
return true;
}
return false;
}
다른 방법은 char Array를 사용하는 것입니다.
public class Palindrome {
public static void main(String[] args) {
String str = "madam";
if(isPalindrome(str)) {
System.out.println("Palindrome");
} else {
System.out.println("Not a Palindrome");
}
}
private static boolean isPalindrome(String str) {
// Convert String to char array
char[] charArray = str.toCharArray();
for(int i=0; i < str.length(); i++) {
if(charArray[i] != charArray[(str.length()-1) - i]) {
return false;
}
}
return true;
}
}
다음은 @Greg 답변 분석입니다.componentsprogramming.com/palindromes
사이드노트:그러나, 나는 그것을 범용적인 방법으로 하는 것이 중요하다.요건은 시퀀스가 양방향으로 반복 가능하며 시퀀스의 요소가 등식을 사용하여 비교 가능하다는 것입니다.자바에서는 어떻게 하는지 모르지만, 여기 C++ 버전이 있습니다.양방향 시퀀스에 대해서는 더 나은 방법을 모릅니다.
template <BidirectionalIterator I>
requires( EqualityComparable< ValueType<I> > )
bool palindrome( I first, I last )
{
I m = middle(first, last);
auto rfirst = boost::make_reverse_iterator(last);
return std::equal(first, m, rfirst);
}
복잡도: 선형 시간,
랜덤 액세스인 경우반복기: 바닥(n/2) 비교 및 바닥(n/2)*2회 반복
양방향 Iterator의 경우: 바닥(n/2) 비교 및 바닥(n/2)*2회 반복 + (3/2)*n회 반복하여 중간(중간 기능)을 찾습니다.
스토리지: O(1)
Dymamic 할당 메모리 없음
최근에 String Builder를 사용하지 않는 palindrome 프로그램을 작성했습니다.답장이 늦었지만 몇몇 사람들에게는 도움이 될 수도 있다.
public boolean isPalindrome(String value) {
boolean isPalindrome = true;
for (int i = 0 , j = value.length() - 1 ; i < j ; i ++ , j --) {
if (value.charAt(i) != value.charAt(j)) {
isPalindrome = false;
}
}
return isPalindrome;
}
스택을 사용하면 다음과 같이 할 수 있습니다.
import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;
import java.util.*;
public class Solution {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String str=in.nextLine();
str.replaceAll("\\s+","");
//System.out.println(str);
Stack<String> stack=new Stack<String>();
stack.push(str);
String str_rev=stack.pop();
if(str.equals(str_rev)){
System.out.println("Palindrome");
}else{
System.out.println("Not Palindrome");
}
}
}
public static boolean isPalindrome(String word) {
String str = "";
for (int i=word.length()-1; i>=0; i--){
str = str + word.charAt(i);
}
if(str.equalsIgnoreCase(word)){
return true;
}else{
return false;
}
}
이렇게 간단한 문제에 대해 얼마나 많은 다양한 해결책이 있는지 놀랍다!여기 또 하나 있어.
private static boolean palindrome(String s){
String revS = "";
String checkS = s.toLowerCase();
String[] checkSArr = checkS.split("");
for(String e : checkSArr){
revS = e + revS;
}
return (checkS.equals(revS)) ? true : false;
}
- 이 실장은 숫자와 문자열에 대해 기능합니다.
- 아무것도 쓰지 않기 때문에 문자열을 문자 배열로 변환할 필요가 없습니다.
public static boolean isPalindrome(Object obj)
{
String s = String.valueOf(obj);
for(int left=0, right=s.length()-1; left < right; left++,right--)
{
if(s.charAt(left++) != s.charAt(right--))
return false;
}
return true;
}
왜 그냥:
boolean isPalindrom(String s) {
char[] myChars = s.toCharArray();
for (int i = 0; i < myChars.length/2; i++) {
if (myChars[i] != myChars[myChars.length - 1 - i]) {
return false;
}
}
return true;
}
import java.util.Scanner;
public class Palindrom {
public static void main(String []args)
{
Scanner in = new Scanner(System.in);
String str= in.nextLine();
int x= str.length();
if(x%2!=0)
{
for(int i=0;i<x/2;i++)
{
if(str.charAt(i)==str.charAt(x-1-i))
{
continue;
}
else
{
System.out.println("String is not a palindrom");
break;
}
}
}
else
{
for(int i=0;i<=x/2;i++)
{
if(str.charAt(i)==str.charAt(x-1-i))
{
continue;
}
else
{
System.out.println("String is not a palindrom");
break;
}
}
}
}
}
private static boolean isPalindrome(String word) {
int z = word.length();
boolean isPalindrome = false;
for (int i = 0; i <= word.length() / 2; i++) {
if (word.charAt(i) == word.charAt(--z)) {
isPalindrome = true;
}
}
return isPalindrome;
}
난 회문에만 효과가 있는 해결책을 찾고 있었어...
- '카약
- "부인"
...하지만...
- "사람, 계획, 운하, 파나마!"
- "내가 본 건 차였어, 고양이였어?"
- 닉슨에 x는 없다.
private boolean isPalindromeIterative(final String string)
{
final char[] characters =
string.replaceAll("[\\W]", "").toLowerCase().toCharArray();
int iteratorLeft = 0;
int iteratorEnd = characters.length - 1;
while (iteratorEnd > iteratorLeft)
{
if (characters[iteratorLeft++] != characters[iteratorEnd--])
{
return false;
}
}
return true;
}
재귀적나는 이 해결책이 반복적인 해결책보다 더 나쁘지는 않을 것이라고 생각한다.불필요한 처리를 피하기 위해 세척 단계를 빼내야 하는 건 좀 지저분하네요.
private boolean isPalindromeRecursive(final String string)
{
final String cleanString = string.replaceAll("[\\W]", "").toLowerCase();
return isPalindromeRecursiveRecursion(cleanString);
}
private boolean isPalindromeRecursiveRecursion(final String cleanString)
{
final int cleanStringLength = cleanString.length();
return cleanStringLength <= 1 || cleanString.charAt(0) ==
cleanString.charAt(cleanStringLength - 1) &&
isPalindromeRecursiveRecursion
(cleanString.substring(1, cleanStringLength - 1));
}
private boolean isPalindromeReversing(final String string)
{
final String cleanString = string.replaceAll("[\\W]", "").toLowerCase();
return cleanString.equals(new StringBuilder(cleanString).reverse().toString());
}
이 게시물에 답한 모든 공로를 통해 이 주제에 대한 해명을 얻을 수 있습니다.
글자가 아닌 것을 고려하다
public static boolean palindromeWords(String s ){
int left=0;
int right=s.length()-1;
while(left<=right){
while(left<right && !Character.isLetter(s.charAt(left))){
left++;
}
while(right>0 && !Character.isLetter(s.charAt(right))){
right--;
}
if((s.charAt(left++))!=(s.charAt(right--))){
return false;
}
}
return true;
}
———
@Test
public void testPalindromeWords(){
assertTrue(StringExercise.palindromeWords("ece"));
assertTrue(StringExercise.palindromeWords("kavak"));
assertFalse(StringExercise.palindromeWords("kavakdf"));
assertTrue(StringExercise.palindromeWords("akka"));
assertTrue(StringExercise.palindromeWords("??e@@c_--e"));
}
여기서는 다수의 String을 동적으로 체크할 수 있습니다.
import java.util.Scanner;
public class Checkpalindrome {
public static void main(String args[]) {
String original, reverse = "";
Scanner in = new Scanner(System.in);
System.out.println("Enter How Many number of Input you want : ");
int numOfInt = in.nextInt();
original = in.nextLine();
do {
if (numOfInt == 0) {
System.out.println("Your Input Conplete");
}
else {
System.out.println("Enter a string to check palindrome");
original = in.nextLine();
StringBuffer buffer = new StringBuffer(original);
reverse = buffer.reverse().toString();
if (original.equalsIgnoreCase(reverse)) {
System.out.println("The entered string is Palindrome:"+reverse);
}
else {
System.out.println("The entered string is not Palindrome:"+reverse);
}
}
numOfInt--;
} while (numOfInt >= 0);
}
}
IMO, 재귀적인 방법이 가장 간단하고 명확합니다.
public static boolean isPal(String s)
{
if(s.length() == 0 || s.length() == 1)
return true;
if(s.charAt(0) == s.charAt(s.length()-1))
return isPal(s.substring(1, s.length()-1));
return false;
}
여기서 문자열에서 가장 큰 회문(palindrome)을 확인합니다.항상 첫 번째 문자부터 시작합니다.
public static String largestPalindromeInString(String in) {
int right = in.length() - 1;
int left = 0;
char[] word = in.toCharArray();
while (right > left && word[right] != word[left]) {
right--;
}
int lenght = right + 1;
while (right > left && word[right] == word[left]) {
left++;
right--;
}
if (0 >= right - left) {
return new String(Arrays.copyOf(word, lenght ));
} else {
return largestPalindromeInString(
new String(Arrays.copyOf(word, in.length() - 1)));
}
}
코드 조각:
import java.util.Scanner;
class main
{
public static void main(String []args)
{
Scanner sc = new Scanner(System.in);
String str = sc.next();
String reverse = new StringBuffer(str).reverse().toString();
if(str.equals(reverse))
System.out.println("Pallindrome");
else
System.out.println("Not Pallindrome");
}
}
언급URL : https://stackoverflow.com/questions/4138827/check-string-for-palindrome
'programing' 카테고리의 다른 글
연쇄 비교의 단순화 (0) | 2022.12.26 |
---|---|
Panda를 사용한 "대용량 데이터" 워크플로우 (0) | 2022.12.26 |
Galera에서 마스터가 다운된 경우 마스터/슬레이브 리플리케이션 로드밸런싱 (0) | 2022.12.26 |
Big Decimal을 정수로 변환 (0) | 2022.12.26 |
Python에서 멀티프로세싱을 사용하는 동안 어떻게 기록해야 합니까? (0) | 2022.12.26 |