计算字符串中最长回文子串

4

我有以下代码用于计算字符串中最长回文子串。在线评测接受O(n^2)的解决方案,但我不知道为什么它不接受我的解决方案,尽管我看起来的算法复杂度是O(n^2)。

class Ideone {

    public static void main(String args[]) {
        Ideone ob = new Ideone();
        String s = "sds";
        System.out.println(ob.longestPalindrome(s));

    }

    public String longestPalindrome(String s) {
        int maxlength = 1;

        String ps = s.charAt(0) + "";

        if (s.length() == 1)
            return s;
        for (int i = 0; i < s.length() - 1; i++) {
            int j = (s.substring(i + 1)).indexOf(s.charAt(i)) + i + 1;
            while (j < s.length() && j > i) {
                if (j - i + 1 > maxlength && check(s.substring(i, j + 1))) {

                    maxlength = j - i + 1;
                    ps = s.substring(i, j + 1);

                }
                if ((s.substring(j + 1)).indexOf(s.charAt(i)) < 0) {
                    break;
                }
                j = (s.substring(j + 1)).indexOf(s.charAt(i)) + j + 1;

            }
        }


        return ps;
    }

    public boolean check(String s) {
        int l = s.length();
        if (l == 1)
            return false;
        int t = l / 2;
        String s1, s2;
        if (l % 2 == 0) {
            s1 = s.substring(0, t);
            s2 = s.substring(t);

        } else {
            s1 = s.substring(0, t);
            s2 = s.substring(t + 1);

        }

        s2 = (new StringBuffer(s2)).reverse().toString();

        if (s1.compareTo(s2) == 0)
            return true;
        else return false;
    }

}

你是否检查过你的代码是否为0(n²)?创建一张表格并绘制运行时间的图表。 - MrSmith42
2个回答

8

乍一看,两个循环和一个需要 O(n) 的 check() 方法来反转字符串可能会导致 O(n³)。

请注意,像以下方法:

  • String.indexOf(..)
  • String.substring(..)
  • String.compareTo(..)
  • StringBuffer.reverse(..)
  • String.toString()

需要遍历数据,因此需要约O(n)而不是常数时间。


1
非常感谢,这对我很有帮助。现在我能够找出为什么我的算法没有被接受了。 - Rishabh Nigam
reverse()不是String的函数,而是StringBuffer的函数。我想澄清一下substring是否也需要线性时间?因为我认为它是一个常数时间函数?如果我错了,请纠正我。提前感谢您。 - Rishabh Nigam
@Rishabh Nigam:根据子字符串的实现方式,它至少与子字符串的大小成线性关系,因为这些数据被复制以创建新实例。我的回答并不是要给出昂贵方法的完整列表,而是关于每个调用方法都必须考虑计算复杂度的评论。 - MrSmith42

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接