2011-11-07 13 views

cevap

-2

İkili arama kullan. Bütün dizeleri karşılaştırmaya çalış. Eşit değilse, ilk karakterleri karşılaştırmaya çalışın. Eşittirlerse dizeleri ayırmaya çalışın (substring(0, str.length()/2). Vb vb.

+3

Ortak önek n ise, ne olursa olsun ilk n karakterlerini karşılaştırmanız gerekir. İkili arama yapmak fazla uğraşır ve fazladan karşılaştırmalar ile sonuçlanabilir. – dyross

1
public class Test{ 
public static void main(String[] args){ 
    String s1 = "Mary Had a Little Lamb"; 
    String s2 = "Mary Had a Big Lamb"; 
    int minStrLen = s1.length(); 
    if (minStrLen > s2.length()){ 
     minStrLen = s2.length(); 
    } 

    StringBuilder output = new StringBuilder(); 
    for(int i=0; i<minStrLen; i++){ 
     if (s1.charAt(i) == s2.charAt(i)){ 
     output.append(s1.charAt(i)); 
     }else{ 
      break; 
     } 
    }  
    System.out.println(output.toString()); 
    } 
} 

Bu en uygun çözüm olmayabilir, ancak bunu anlamak ve programlamak kolaydır.

Bu fikri, merge-sort algoritmasının birleştirme yönteminden ödünç aldım. Liste birleştirme tekniği hakkında çok az şey okursanız, algoritmamın mantığını daha iyi anlayacaksınız. adımın dizge1 ve tekrar çek son kömürü silme tutmak gerçek bir döngü içinde

  • değilse

  • +1

    Bir StringBuilder'a ihtiyacınız yok, sadece substring'i döndür. Benim çözümüme bakın. – dyross

    1
    String str1; 
    String str2; 
    // assuming str1.length > str2.length 
    
    1. a.startsWith (b) == 1.
    26

    Değilsin kullanmaya gerek bir StringBuilder - sadece alt dize döndürür: bir çoklu stri uygulanan

    public String greatestCommonPrefix(String a, String b) { 
        int minLength = Math.min(a.length(), b.length()); 
        for (int i = 0; i < minLength; i++) { 
         if (a.charAt(i) != b.charAt(i)) { 
          return a.substring(0, i); 
         } 
        } 
        return a.substring(0, minLength); 
    } 
    
    1

    Bu çözüm ng dizisi. 3 veya 4 dizginiz olduğunda, StringBuilder kullanmak daha iyidir. 2 dizgisi için, substring kullanmak tamam. Kod # C#:

    public string LongestCommonPrefix(string[] strs) { 
        if(strs.Length == 0) return string.Empty; 
    
        Array.Sort(strs); 
    
        var first = strs[0]; 
        var last = strs[strs.Length - 1]; 
    
        var sb = new StringBuilder(); 
        for(int i = 0; i< first.Length; i++) 
        { 
         if(first[i] != last[i]) 
         { 
          break; 
         } 
         sb.Append(first[i]); 
        } 
    
        return sb.ToString(); 
    } 
    
    +0

    Neden builder'i kullanıyorsunuz? İndeksler üzerinde çalışılması ve sonuç olarak alt dizinin alınması yeterli olacaktır. –