:En uzun ortak öneki bulun? İki dizeleri ise
dönmelidir "Mary'nin Büyük Lamb Had" "Mary'nin küçük bir kuzusu var"
"Mary'nin Had"
:En uzun ortak öneki bulun? İki dizeleri ise
dönmelidir "Mary'nin Büyük Lamb Had" "Mary'nin küçük bir kuzusu var"
"Mary'nin Had"
İ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.
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
Bir StringBuilder'a ihtiyacınız yok, sadece substring'i döndür. Benim çözümüme bakın. – dyross
String str1;
String str2;
// assuming str1.length > str2.length
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);
}
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();
}
Neden builder'i kullanıyorsunuz? İndeksler üzerinde çalışılması ve sonuç olarak alt dizinin alınması yeterli olacaktır. –
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