2011-04-09 12 views
1

このアルゴリズムの複雑さは何ですか?それは少なくともO(n^2)のようです。最長のpalindrome接頭辞complextity

// civic 
public static boolean isCharPalindrome(String test) { 
     String stripped = test.toLowerCase().replaceAll("[^0-9a-zA-Z]", ""); 
     for(int i = 0; i < stripped.length()/2; i++) { 
      if(stripped.charAt(i) != stripped.charAt(stripped.length() - 1 - i)) { 
       return false; 
      } 
     } 
     return true; 
    } 

// ILLINOISURB 
public static String longestPrefixPalindrome(String test){ 
    String max_prefix = test.substring(0,1); 
    for(int i=test.length()-1; i>=0; i--){ 
     String maxPrefix = test.substring(0, i); 
     if(isCharPalindrome(maxPrefix)){ 
      return maxPrefix; 
     } 
    } 

    return max_prefix; 
} 

public static void main(String[] args) { 
    String str = "A man, a plan, a canal, Panama!"; 
    System.out.println("isCharPalindrome:" + isCharPalindrome("A man, a plan, a canal, Panama!")); 
    System.out.println("longestPrefixPal:" + longestPrefixPalindrome("NILLINOISURB")); 
} 
+0

「// TODO自動生成メソッドスタブ」というコメントがあります。このようなコメントは、手で何かするとコメントが間違ってしまうため、メソッドに触れるとすぐに削除されます。 –

+0

は私に[理論的cs](http://cstheory.stackexchange.com/)のように聞こえます – mbx

+1

理論的なcsはこれのような学位レベルの質問のためではありません。それはここに属します。 –

答えて

2

はい。 isCharPalindromeの複雑さはO(n)であり、これをlongestPrefixPalindromeからn回呼び出すので、複雑さはO(n^2)です。

しかし、最も長いプレフィックスから始め、テストされたプレフィックスのサイズを小さくすることで、複雑さを軽減できます。これを行うと、あなたはpaliendromeを見つけるとすぐにメソッドを終了することができます。あなたは毎回最後まで行く必要はありません。

これに応じてlongestPrefixPalindromeに変更する方法を知っていることをお約束します。

@パジョンの答えを見てください。あなたがそれについて考えるなら、複雑さをO(n)まで得ることができます。私が与えた答えは実際にあなたにそれができることについてのヒントを与えるでしょう。

+0

ILLINOISURBに「illi」のような接頭辞が見つからなかったため、その回答が削除されました。 –

+0

ええ。しかし、あなたはこの問題O(n)の複雑さをどうやって作ることができるのか理解しましたか? – euphoria83

+0

いいえ。しかし、任意の入力については、それほど悪くはありませんか? Nillinoisurbの場合、長さ12の文字列の場合、メソッドisCharPalindromは12回呼び出されますが、最初の文字列 'N'が部分文字列の最後に一致するかどうかは常に検索されます。一致がある場合。今度は、平均入力がどのようになるか、最初の文字が部分文字列内の別の文字とどれくらい一致するかを調べることができます。もちろん、回文は実生活では頻繁に調査されることはないので、経験的なデータはありません。完全に人工的な単語については理由があります。 –