鍍金池/ 問答/人工智能  Java  C  C++/ 輸入一個字符串 str,可以刪除字符串 str 中的任意字符,讓剩下的字符串形成

輸入一個字符串 str,可以刪除字符串 str 中的任意字符,讓剩下的字符串形成一個對稱字符串,且該字符串為最長對稱字符串

題目:

輸入一個字符串s,我們可以刪除字符串s中的任意字符,讓剩下的字符串形成一個對稱字符串,且該字符串為最長對稱字符串。

例如:

  1. 輸入google,則找到最長對稱字符串為goog
  2. 輸入abcda則能找到最長對稱字符串為aba。
最長對稱字符串存在多個,則輸出多個相同長度的最長對稱字符串。

輸入輸出示例:

public static void main(String[] args){
    // TODO: 輸出最長對稱字符串: goog
    String input1 = "google";
    
    // TODO: 輸出最長對稱字符串: aca
    String input2 = "abcda";
    
    // TODO: 輸出最長對稱字符串: opo/upu
    String input3 = "opo-upu";
}
回答
編輯回答
逗婦惱

https://www.cnblogs.com/yingp...
這個有個JAVA代碼,你可以參考下。我一開始是用C寫的,感覺太麻煩了,JAVA不太會,但是看懂了一點,希望可以幫到你

2018年6月21日 22:40
編輯回答
來守候

問題已經(jīng)解決

由于提供的代碼對于opo-upu這樣的測試用例無法得到正確的結(jié)果,所以,參考了 @studioJava——最長公共子串問題LCS提供的思路之后,編寫了如下代碼:
圖片描述圖片描述圖片描述

  • findLCS(String input): String 獲取最大回文串

    private static String findLCS(String input) {
        // 要返回的結(jié)果
        StringBuilder result = new StringBuilder();
    
        // 將字符串反轉(zhuǎn)
        String reverse = new StringBuilder(input).reverse().toString();
    
        // 字符串長度
        int len = input.length();
    
        // 矩陣 -> 二維數(shù)組
        int[][] temp = new int[len][len];
    
        // 橫向字符
        char[] hor = input.toCharArray();
    
        // 縱向字符
        char[] ver = reverse.toCharArray();
    
        // 給矩陣(二維數(shù)組賦值)
        for (int i = 0; i < len; i++) {
            for (int j = 0; j < len; j++) {
                temp[i][j] = (hor[j] == ver[i]) ? 1 : 0;
            }
        }
    
        // 找到第一個橫向
        int horIndex = -1;
        for (int i = 0; i < len - 1; i++) {
            if (temp[0][i] == 1) {
                horIndex = i;
            }
        }
    
        // 找到第一個縱向
        int verIndex = -1;
        for (int i = 0; i < len - 1; i++) {
            if (temp[i][0] == 1) {
                verIndex = i;
            }
        }
    
        // 處理特殊情況的標(biāo)識,如 abcda
        boolean flag = false;
    
        int indexHor = 0;
        if (horIndex != -1 && horIndex != 0) {
            for (int i = horIndex; i < len; i++) {
                if (temp[indexHor++][i] == 1) {
                    result.append(hor[i]);
                }
            }
            flag = true;
        }
    
        int indexVer = verIndex;
        if (verIndex != -1) {
            if (flag) {
                result.append("/");
            }
            for (int i = 0; i < len - verIndex; i++) {
                if (temp[indexVer++][i] == 1) {
                    result.append(hor[i]);
                }
            }
        }
    
        return result.toString();
    }
  • main(String[] args): void 主方法

    public static void main(String[] args) {
    
        String input1 = "google";
        String input2 = "abcda";
        String input3 = "opo-upu";
    
        System.out.println(input1 + " -> " + findLCS(input1)); // 結(jié)果: google -> goog
        System.out.println(input2 + " -> " + findLCS(input2)); // 結(jié)果: abcda -> aca
        System.out.println(input3 + " -> " + findLCS(input3)); // 結(jié)果: opo-upu -> opo/upu
    
    }
2017年11月6日 10:02