Een recursieve methode maken voor Palindrome

Ik probeer een palindrome-programma te maken met behulp van een recursie binnen Java, maar ik zit vast, dit is wat ik tot nu toe heb:

public static void main (String[] args){
 System.out.println(isPalindrome("noon"));
 System.out.println(isPalindrome("Madam I'm Adam"));
 System.out.println(isPalindrome("A man, a plan, a canal, Panama"));
 System.out.println(isPalindrome("A Toyota"));
 System.out.println(isPalindrome("Not a Palindrome"));
 System.out.println(isPalindrome("asdfghfdsa"));
}
public static boolean isPalindrome(String in){
 if(in.equals(" ") || in.length() == 1 ) return true;
 in= in.toUpperCase();
 if(Character.isLetter(in.charAt(0))
}
public static boolean isPalindromeHelper(String in){
 if(in.equals("") || in.length()==1){
  return true;
  }
 }
}

Kan iemand een oplossing voor mijn probleem leveren?


1, Autoriteit 100%

Hier ben ik code voor u:

Maar ik zou u sterk voorstellen om te weten hoe het werkt,

Van uw vraag bent u volledig onleesbaar.

Probeer deze code te begrijpen. Lees de opmerkingen van Code

import java.util.Scanner;
public class Palindromes
{
    public static boolean isPal(String s)
    {
        if(s.length() == 0 || s.length() == 1)
            // if length =0 OR 1 then it is
            return true; 
        if(s.charAt(0) == s.charAt(s.length()-1))
            // check for first and last char of String:
            // if they are same then do the same thing for a substring
            // with first and last char removed. and carry on this
            // until you string completes or condition fails
            return isPal(s.substring(1, s.length()-1));
        // if its not the case than string is not.
        return false;
    }
    public static void main(String[]args)
    {
        Scanner sc = new Scanner(System.in);
        System.out.println("type a word to check if its a palindrome or not");
        String x = sc.nextLine();
        if(isPal(x))
            System.out.println(x + " is a palindrome");
        else
            System.out.println(x + " is not a palindrome");
    }
}

Antwoord 2, autoriteit 14%

Nou:

  • Het is niet duidelijk waarom je twee methoden met dezelfde handtekening hebt. Wat moeten ze bereiken?
  • Waarom test je bij de eerste methode voor het testen van een enkele spatie ofeen enkel teken?
  • U kunt overwegen uw beëindigingsvoorwaarde te generaliseren naar “als de lengte kleiner is dan twee”
  • Bedenk hoe je wilt recurren. Een optie:
    • Controleer of de eerste letter gelijk is aan de laatste letter. Zo niet, retourneer false
    • Neem nu een subtekenreeks om de eerste en laatste letters effectief te verwijderen, en herhaal
  • Is dit bedoeld als een oefening in recursie? Dat is zeker eenmanier om het te doen, maar het is zeker niet de enige manier.

Ik ga het voorlopig niet duidelijker formuleren dan dat, omdat ik vermoed dat dit huiswerk is – sommigen zullen de hulp hierboven misschien als te veel beschouwen (ik aarzel zelf zeker een beetje). Als je problemen hebt met de bovenstaande hints, werk dan je vraag bij om te laten zien hoe ver je bent gekomen.


Antwoord 3, autoriteit 11%

public static boolean isPalindrome(String in){
   if(in.equals(" ") || in.length() < 2 ) return true;
   if(in.charAt(0).equalsIgnoreCase(in.charAt(in.length-1))
      return isPalindrome(in.substring(1,in.length-2));
   else
      return false;
 }

Misschien heb je zoiets nodig. Niet getest, ik ben niet zeker van tekenreeksindexen, maar het is een beginpunt.


Antwoord 4, autoriteit 9%

Ik denk dat recursie niet de beste manier is om dit probleem op te lossen, maar een recursieve manier die ik hier zie, wordt hieronder weergegeven:

String str = prepareString(originalString); //make upper case, remove some characters 
isPalindrome(str);
public boolean isPalindrome(String str) {
   return str.length() == 1 || isPalindrome(str, 0);
}
private boolean isPalindrome(String str, int i) {
       if (i > str.length / 2) {
      return true;
   }
   if (!str.charAt(i).equals(str.charAt(str.length() - 1 - i))) {
      return false;
   }
   return isPalindrome(str, i+1);
}

Antwoord 5, autoriteit 3%

Hier is mijn aanpak:

public class Test {
    public static boolean isPalindrome(String s) {
        return s.length() <= 1 ||
            (s.charAt(0) == s.charAt(s.length() - 1) &&
             isPalindrome(s.substring(1, s.length() - 1)));
    }
    public static boolean isPalindromeForgiving(String s) {
        return isPalindrome(s.toLowerCase().replaceAll("[\\s\\pP]", ""));
    }
    public static void main(String[] args) {
        // True (odd length)
        System.out.println(isPalindrome("asdfghgfdsa"));
        // True (even length)
        System.out.println(isPalindrome("asdfggfdsa"));
        // False
        System.out.println(isPalindrome("not palindrome"));
        // True (but very forgiving :)
        System.out.println(isPalindromeForgiving("madam I'm Adam"));
    }
}

Antwoord 6, autoriteit 3%

public class palin
{ 
    static boolean isPalin(String s, int i, int j)
    {
        boolean b=true;
        if(s.charAt(i)==s.charAt(j))
        {
            if(i<=j)
                isPalin(s,(i+1),(j-1));
        }
        else
        {
            b=false;
        }
        return b;
    }
    public static void main()
    {
        String s1="madam";
        if(isPalin(s1, 0, s1.length()-1)==true)
            System.out.println(s1+" is palindrome");
        else
            System.out.println(s1+" is not palindrome");
    }
}

Antwoord 7, autoriteit 3%

Sommige codes zijn streng. In plaats van een substring te maken die een nieuw object creëert, kunnen we indexen gewoon doorgeven in recursieve aanroepen zoals hieronder:

private static boolean isPalindrome(String str, int left, int right) {
    if(left >= right) {
        return true;
    }
    else {
        if(str.charAt(left) == str.charAt(right)) {
            return isPalindrome(str, ++left, --right);
        }
        else {
            return false;
        }
    }
}
 public static void main(String []args){
    String str = "abcdcbb"; 
    System.out.println(isPalindrome(str, 0, str.length()-1));
 }

Antwoord 8

Hier zijn drie eenvoudige implementaties, eerst de oneliner:

public static boolean oneLinerPalin(String str){
    return str.equals(new StringBuffer(str).reverse().toString());
}

Dit is natuurlijk vrij traag omdat het een stringbuffer aanmaakt en deze omkeert, en de hele string wordt altijd gecontroleerd, ongeacht of het een palindroom is of niet, dus hier is een implementatie die alleen het vereiste aantal tekens controleert en dit doet plaats, dus geen extra stringBuffers:

public static boolean isPalindrome(String str){
    if(str.isEmpty()) return true;
    int last = str.length() - 1;        
    for(int i = 0; i <= last / 2;i++)
        if(str.charAt(i) != str.charAt(last - i))
            return false;
    return true;
}

En recursief:

public static boolean recursivePalin(String str){
    return check(str, 0, str.length() - 1);
}
private static boolean check (String str,int start,int stop){
    return stop - start < 2 ||
           str.charAt(start) == str.charAt(stop) &&
           check(str, start + 1, stop - 1);
}

Antwoord 9

public static boolean isPalindrome(String str)
{
    int len = str.length();
    int i, j;
    j = len - 1;
    for (i = 0; i <= (len - 1)/2; i++)
    {
      if (str.charAt(i) != str.charAt(j))
      return false;
      j--;
    }
    return true;
} 

Antwoord 10

Probeer dit:

package javaapplicationtest;
public class Main {
    public static void main(String[] args) {
        String source = "mango";
        boolean isPalindrome = true;
        //looping through the string and checking char by char from reverse
        for(int loop = 0; loop < source.length(); loop++){          
            if( source.charAt(loop) != source.charAt(source.length()-loop-1)){
                isPalindrome = false;
                break;
            }
        }
         if(isPalindrome == false){
             System.out.println("Not a palindrome");
         }
         else
             System.out.println("Pailndrome");
    }
}

Antwoord 11

String source = "liril";
StringBuffer sb = new StringBuffer(source);
String r = sb.reverse().toString();
if (source.equals(r)) {
    System.out.println("Palindrome ...");
} else {
    System.out.println("Not a palindrome...");
}

Antwoord 12

public class chkPalindrome{
public static String isPalindrome(String pal){
if(pal.length() == 1){
return pal;
}
else{
String tmp= "";
tmp = tmp + pal.charAt(pal.length()-1)+isPalindrome(pal.substring(0,pal.length()-1));
return tmp;
}
}
     public static void main(String []args){
         chkPalindrome hwObj = new chkPalindrome();
         String palind = "MADAM";
       String retVal= hwObj.isPalindrome(palind);
      if(retVal.equals(palind))
       System.out.println(palind+" is Palindrome");
       else
       System.out.println(palind+" is Not Palindrome");
     }
}

13

Er is geen code kleiner dan dit:

public static boolean palindrome(String x){
    return (x.charAt(0) == x.charAt(x.length()-1)) && 
        (x.length()<4 || palindrome(x.substring(1, x.length()-1)));
}

Als u iets wilt controleren:

public static boolean palindrome(String x){
    if(x==null || x.length()==0){
        throw new IllegalArgumentException("Not a valid string.");
    }
    return (x.charAt(0) == x.charAt(x.length()-1)) && 
        (x.length()<4 || palindrome(x.substring(1, x.length()-1)));
}

lol b -]


14

public static boolean isPalindrome(String p)
    {
        if(p.length() == 0 || p.length() == 1)
            // if length =0 OR 1 then it is
            return true; 
         if(p.substring(0,1).equalsIgnoreCase(p.substring(p.length()-1))) 
            return isPalindrome(p.substring(1, p.length()-1));
        return false;
    }

Deze oplossing is niet hoofdlettergevoelig. Dus als u bijvoorbeeld het volgende woord heeft: “adinida”, dan wordt u waar als u “Adninida” of “adninida” of “adinidA” doet, wat we willen.

Ik vind het antwoord van @JigarJoshi leuk, maar het enige probleem met zijn aanpak is dat je vals krijgt voor woorden die hoofdletters bevatten.


Antwoord 15

Voorbeeld van palindroom:

static boolean isPalindrome(String sentence) {
    /*If the length of the string is 0 or 1(no more string to check), 
     *return true, as the base case. Then compare to see if the first 
     *and last letters are equal, by cutting off the first and last 
     *letters each time the function is recursively called.*/
    int length = sentence.length();
    if (length >= 1)
        return true;
    else {
        char first = Character.toLowerCase(sentence.charAt(0));
        char last = Character.toLowerCase(sentence.charAt(length-1));
        if (Character.isLetter(first) && Character.isLetter(last)) {
            if (first == last) {
                String shorter = sentence.substring(1, length-1);
                return isPalindrome(shorter);
            } else {
                return false;
            }
        } else if (!Character.isLetter(last)) {
            String shorter = sentence.substring(0, length-1);
            return isPalindrome(shorter);
        } else {
            String shorter = sentence.substring(1);
            return isPalindrome(shorter);
        }
    }
}

Geroepen door:

System.out.println(r.isPalindrome("Madam, I'm Adam"));

Wordt afgedrukt als palindroom, wordt afgedrukt als niet waar.

Als de lengte van de tekenreeks 0 of 1 is (geen tekenreeks meer om te controleren), retourneert u true als basisgeval. Dit basisscenario wordt vlak daarvoor aangeduid met een functieaanroep. Vergelijk vervolgens om te zien of de eerste en laatste letters gelijk zijn, door de eerste en laatste letters af te knippen elke keer dat de functie recursief wordt aangeroepen.


Antwoord 16

Hier is de code voor palindroomcontrole zonder veel strings te maken

public static boolean isPalindrome(String str){
    return isPalindrome(str,0,str.length()-1);
}
public static boolean isPalindrome(String str, int start, int end){
    if(start >= end)
        return true;
    else
        return (str.charAt(start) == str.charAt(end)) && isPalindrome(str, start+1, end-1);
}

Antwoord 17

openbare klasse PlaindromeNumbers {

int func1(int n)
{
    if(n==1)
        return 1;
    return n*func1(n-1);
}
static boolean check=false;
int func(int no)
{
    String a=""+no;
    String reverse = new StringBuffer(a).reverse().toString();
    if(a.equals(reverse))
    {
        if(!a.contains("0"))
        {
           System.out.println("hey");
            check=true;
            return Integer.parseInt(a);
        }
    }
      //  else
      //  {
    func(no++);
    if(check==true)
    {
        return 0;
    }
       return 0;   
   }
public static void main(String[] args) {
    // TODO code application logic here
    Scanner in=new Scanner(System.in);
    System.out.println("Enter testcase");
   int testcase=in.nextInt(); 
   while(testcase>0)
   {
     int a=in.nextInt();
     PlaindromeNumbers obj=new PlaindromeNumbers();
       System.out.println(obj.func(a));
       testcase--;
   }
}

}


Antwoord 18

/**
     * Function to check a String is palindrome or not
     * @param s input String
     * @return true if Palindrome
     */
    public boolean checkPalindrome(String s) {
        if (s.length() == 1 || s.isEmpty())
            return true;
        boolean palindrome = checkPalindrome(s.substring(1, s.length() - 1));
        return palindrome && s.charAt(0) == s.charAt(s.length() - 1);
    }

Antwoord 19

Eenvoudige oplossing
2 Scenario –(Oneven of even lengte string)

Basisconditie& Algo recursief(ch, i, j)

  1. i==j //even len

  2. als ik< j recurve-oproep (ch, i +1,j-1)

  3. else return ch[i] ==ch[j]// Extra basisvoorwaarde voor oude lengte

public class HelloWorld {
 static boolean ispalindrome(char ch[], int i, int j) {
  if (i == j) return true;
  if (i < j) {
   if (ch[i] != ch[j])
    return false;
   else
    return ispalindrome(ch, i + 1, j - 1);
  }
  if (ch[i] != ch[j])
   return false;
  else
   return true;
 }
 public static void main(String[] args) {
  System.out.println(ispalindrome("jatin".toCharArray(), 0, 4));
  System.out.println(ispalindrome("nitin".toCharArray(), 0, 4));
  System.out.println(ispalindrome("jatinn".toCharArray(), 0, 5));
  System.out.println(ispalindrome("nittin".toCharArray(), 0, 5));
 }
}

Antwoord 20

Om dat te bereiken, moet je niet alleen weten hoe recursie werkt, maar moet je ook de String-methode begrijpen.
hier is een voorbeeldcode die ik heb gebruikt om dit te bereiken: –

class PalindromeRecursive {
  public static void main(String[] args) {
    Scanner sc=new Scanner(System.in);
    System.out.println("Enter a string");
    String input=sc.next();
    System.out.println("is "+ input + "a palindrome : " +  isPalindrome(input));
  }
  public static  boolean isPalindrome(String s)
  {
    int low=0;
    int high=s.length()-1;
    while(low<high)
    {
      if(s.charAt(low)!=s.charAt(high))
      return false;
      isPalindrome(s.substring(low++,high--));
    }
    return true;
  }
}

Other episodes