簡體   English   中英

在Java中將字符串轉換為回文

[英]Converting a string into a palindrome in Java

我試圖通過在 S 前面添加 0 個或多個字符來找到可以從 S 創建的最短回文。 例如,可以從 'baaa' 構造出的最短回文是 'aaabaaa'。 下面給出了我正在使用的兩個函數。 這適用於這種情況,因為在所有情況下都不會產生最短的結果。

public static boolean checkPalindrome(String s){

        for (int i = 0; i < s.length()/2; i++) {
            if (s.charAt(i) != s.charAt(s.length() - i - 1)) return false;
        }

        return true;

    }

    public static int makePalindrome(String s){
    int min = 0;
    StringBuilder str = new StringBuilder(s);
    for (int i = 1; i < s.length() ; i++) {
        str.insert(0, s.charAt(i));
        if (checkPalindrome(str.toString()) == true) {
            min = str.length();
            break;
        }

    }
    return min;
}

我似乎無法弄清楚我錯過了什么合乎邏輯的步驟。

您的輔助方法checkPalindrome似乎是正確的。 您的想法也是正確的(追加字符直到結果為回文),但是您的處理方式是錯誤的。

重申:我們的邏輯是,雖然我們的結果不是回文,但從末尾(向字符串的開頭移動)取下一個字符並將其附加到前綴。 所以對於字符串"abcd" ,我們會嘗試

  • "" + "abcd" -> "abcd" -> 假
  • "d" + "abcd" -> "dabcd" -> 假
  • "dc" + "abcd" -> "dcabcd" -> 假
  • "dcb" + "abcd" -> "dcbabcd" -> 真,終止

這是一個固定版本:

public static String makePalindrome(String base){
    String pref = "";
    int i = base.length() - 1;
    while(! checkPalindrome(pref + base)){
        pref = pref + base.charAt(i);
        i --;
    }
    return pref + base;
}

IDEONE: http ://ideone.com/tawjmG

我們可以使用以下邏輯找到最短的回文:

找到中點,從 0 到中點循環,length-1 到中點。

如果是回文,則返回

如果不是回文,在中點加1,做同樣的邏輯

在代碼中:

static String shortestPalindrome(String s) {
    if (s.length() == 1) return s;
    return recShortestPalindrome(s, s.length()>>1, 0);
}

static String recShortestPalindrome(String s, int mid, int add) {
    // AABBA[X]
    int fakeLen = s.length() + add;
    for (int i = 0; i < mid; i++) {
        char c1 = s.charAt(i);
        int p1 = fakeLen - 1 - i;

        if (p1 < s.length()) {
            char c2 = s.charAt(p1);

            if (c2 != c1) {
                return recShortestPalindrome(s, mid+1, add+1);
            }
        }
    }

    // found a pattern that works
    String h1 = s.substring(0, mid);
    String h2 = new StringBuilder(h1).reverse().toString();

    String ret = h1+h2;

    int midPoint = ret.length()/2;

    if (ret.length()%2 == 0 && ret.length() >= 2) {
        char c1 = ret.charAt(midPoint);
        char c2 = ret.charAt(midPoint-1);

        if (c1 == c2) {
            return ret.substring(0, midPoint) + ret.substring(midPoint+1, ret.length());
        }
    }

    return h1+h2;
}

我不確定我是否理解這個問題,但根據我的理解,您想將像Hello這樣的字符串轉換為olleHello要做到這一點,請使用如下循環遍歷字符串的每個字符:

    String example = "Hello There Mate"; //our string
    StringBuilder exampleBuilder = new StringBuilder();
    for(int i=example.length()-1; i>0; i--)
        exampleBuilder.append(example.charAt(i));
    //Our loop, the reason why it is example.lenght-1
    //is because we want the first letter to appear only
    //1 time :)
    String finalString = exampleBuilder.toString()+example;
    //The final string, should be 'olleHello'
    System.out.println(finalString);

希望這就是你要找的:D

蟒蛇解決方案:

def isPalindrome(x):
    if x == "":
        return False

    r = ""
    r = str(x)
    r = r[::-1]

    return True if x == r else False

def makePalindrome(my_str):

    pref = ""
    i = len(my_str) - 1

    while isPalindrome(pref + my_str) == False:
        pref = pref + my_str[i]
        i -= 1

    return pref + my_str







my_str = "abcd"
print(makePalindrome(my_str))

暫無
暫無

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

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