簡體   English   中英

在java中檢查字符串是否為回文的遞歸方法

[英]recursive method that checks if a string is palindrome in java

輸入:“mnkknm”,其中 n=0輸出:標志總是等於 1 而它應該等於 3 並且它返回 -1 有什么問題? 注意:回文意味着例如,如果馬拉雅拉姆語的反轉也是馬拉雅拉姆語,那么它的回文另一個注意:我應該編寫遞歸代碼,因為它是家庭作業

public static int PalindromeCheck(String x , int n) 
{

int flag =0;
if (n+1 !=x.length()/2)
{
char s = x.charAt(n);
char y = x.charAt(x.length()-1-n);
if (s==y)
{    flag++;
System.out.println(flag); // i write it to check the value of the flag
}

return  flag+PalindromeCheck(x,n+1) ;
}

if (flag==x.length()/2)
{
return 1;}
else{
return -1;
}

請試試這個方法

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;
}

首先,我將創建一個具有該遞歸簽名的幫助方法(公共函數應該只接受一個String )。 我們可以在那里測試null和空字符串作為特殊情況。 喜歡,

public static boolean isPalindrome(String x) {
    if (x == null) {
        return false;
    } else if (x.isEmpty()) {
        return true;
    }
    return isPalindrome(x, 0);
}

那么您當前的方法似乎很接近,但是您想將n與小於運算符與x的一半長度進行比較。 然后測試右側的字符是否匹配(從x.length()偏移n但我們需要-1因為基於零的索引)。 此外,該方法應該返回一個boolean (並且我修復了名稱)。 喜歡

private static boolean isPalindrome(String x, int n) {
    if (n < x.length() / 2) {
        if (x.charAt(n) != x.charAt(x.length() - n - 1)) {
            return false;
        }
        return isPalindrome(x, n + 1);
    }
    return true;
}

我會先做 2 或 3 次快速檢查:

  1. 如果第一個字符與最后一個字符不匹配。 這是一個巨大的節省時間而無需反轉任何東西,尤其是當輸入很長時

  2. 然后問它來定位是不一樣的第一個任意字符。 如果不是,則字符串已經是相同字符的不間斷鏈,那么它一定是回文。

  3. (可選)如果輸入真的很長,請快速檢查相同第一個字符的組件的分布 - 根據回文的定義,

如果長度是偶數,那么該字符的出現次數也必須是偶數。

如果長度是奇數,那么它應該是偶數,除非正好中心的字符也是同一個,否則你會知道左右之間的分布已經不平衡,那么當你可以返回時反轉它有什么意義此時為 false 並節省時間。

如果兩個都通過,則執行其他人的建議:反轉右側的一半並檢查它是否與最左側的索引位置對齊(0 或 1,具體取決於哪種語言)。 逆轉部分不必進行任何這些小檢查。 只需高速反轉即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM