Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何写返回谁的信,你应该删除,使字符串回文?_Java_Algorithm - Fatal编程技术网

Java 如何写返回谁的信,你应该删除,使字符串回文?

Java 如何写返回谁的信,你应该删除,使字符串回文?,java,algorithm,Java,Algorithm,和前面的问题一样,练习是否可以通过删除1或2个字符来创建最小长度为3个字符的回文字符串。例如字符串“abjchba”,我们可以删除字母“jc”并获得回文,在这种情况下,程序应该返回删除的字母“jc”。我知道我们可以通过删除“ch”来删除回文,但在练习中,我们应该删除字符串中较早出现的字符。程序应始终尝试创建最长的回文子字符串。我编写了反转字符串的方法和检查字符串是否为回文的方法: private static String reverse(String string) { ret

和前面的问题一样,练习是否可以通过删除1或2个字符来创建最小长度为3个字符的回文字符串。例如字符串“abjchba”,我们可以删除字母“jc”并获得回文,在这种情况下,程序应该返回删除的字母“jc”。我知道我们可以通过删除“ch”来删除回文,但在练习中,我们应该删除字符串中较早出现的字符。程序应始终尝试创建最长的回文子字符串。我编写了反转字符串的方法和检查字符串是否为回文的方法:

private static String reverse(String string) {
        return new StringBuilder(string).reverse().toString();
    }

private static boolean isPalin(String string) {
        return string.equals(reverse(string));
    }
我还提出了创建回文的方法,以返回符号,我们应该删除,使回文,但因为我对某人的工作'临时'我得到了例外。有人知道如何修复它并完成练习吗

private static String createPalindrome(String str) {
        StringBuilder result = new StringBuilder();
        StringBuilder temp = new StringBuilder(str);
        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i) == str.charAt(str.length() - 1 - i)){
                continue;
            }else {
                result.append(str.charAt(i));
                temp.deleteCharAt(i);
                if (isPalin(temp.toString())){
                    return result.toString();
                }
            }
        }
        return "not possible";
    }
私有静态字符串createPalindrome(字符串str){
StringBuilder结果=新建StringBuilder();
StringBuilder temp=新的StringBuilder(str);
对于(int i=0;i
方法1:

  • 查找(LPS)
  • 给定字符串:“abjchba”

    最长回文子序列:“abhba”。像“abjba”和“abcba”这样的其他字符也是lp,但您希望删除前面出现的字符,以便“abhba”

    如果(输入字符串长度-LPS长度)>2,则返回“不可能”

  • 从输入字符串中删除LPS中不包含的字母
  • 开始将字符串与LPS匹配。“j'和c'不匹配。将它们添加到结果并返回

    方法2:

  • 在输入字符串及其反面之间查找(LCS)

    字符串:“abjchba”

    反面:“abhcjba”

    LCS:以“abhba”为例

  • 如果(输入字符串长度-LCS长度)>2,则返回“不可能”

  • 步骤2与上述方法1中的步骤相同

  • 当您尝试最多2次删除时,我想我们是否可以在时间复杂度方面做得更好。

    我认为修复代码的最简单方法是使用递归。当您发现一个不匹配的字符时,删除它并递归调用

    // Helper function to remove a character from a string
    public static String removeAt(String s, int i)
    {
        return s.substring(0, i) + s.substring(i + 1);
    }
    private static String createPalindromeRecursive(String str) {
        // Only need to check half the string
        for (int i = 0, j = str.length() - 1; i < j; i++, j--) {
            // if (something) continue; else {} <- the else is not needed
            //     because the continue skips to the end of the loop
            // or you can negate the condition and don't use continue
            if (str.charAt(i) == str.charAt(j)){
                continue;
            }
            String temp = createPalindrome(removeAt(str, i));
            // Success. Return the new string
            if (null != temp) return temp;
            else return null;
        }
        return str;
    }
    private static String createPalindrome(String str) {
        String palindrome = createPalindromeRecursive(str);
        if (palindrome == null || palindrome.length() < str.length() - 2) {
            return "not possible";
        }
        else {
            return palindrome;
        }
    }
    
    //从字符串中删除字符的帮助函数
    公共静态字符串移除(字符串s,int i)
    {
    返回s子串(0,i)+s子串(i+1);
    }
    私有静态字符串CreatePalindromeCursive(字符串str){
    //只需要检查半个字符串
    对于(int i=0,j=str.length()-1;i//如果(某事)继续;否则{}你得到的
    异常是什么?此外,你认为代码的哪一部分有问题?请调试代码并添加细节。你试图在添加任何项目之前删除“temp”中的一个项目。如果你修复了异常,你的方法将因
    bcba
    而失败。请查看发布的答案,了解一些有效的方法。I got StringIndexOutOfBoundException这是因为我正在处理StringBuilder临时文件,如果我从临时文件中删除字符,临时文件的大小将减小,但str长度为常量,这适用于“bccbab”?@ShridharRKulkarni这是真的,但帖子说需要删除字符串中较早出现的字符。考虑到这种限制,我不认为
    bccbab
    会通过。目标是形成回文。在实现回文的同时,如果有任何连接,则需要删除最左边的字符。因此,“jc”被删除而不是字符串“abjchba”中的“ch”“@ShridharRKulkarni在我看来,任务是通过删除字符串中较早出现的字符来创建最长的回文。这就是代码的作用:。可能我误解了要求。它应该返回删除的字母,但这不是问题,感谢您的思考,但它不起作用,因为我给字符串“mmop”函数应该返回“不可能”,但它返回“p”。如果只计算矩阵中的| x-y部分,则可以在线性时间和空间中执行LCS方法|