2012-05-23 7 views
10

Um die minimale Anzahl von Einfügungen zu finden, die zum Konvertieren einer gegebenen Zeichenfolge (n) zu Palindrom erforderlich ist, finde ich die längste gemeinsame Untersequenz der Zeichenfolge (lcs_string) und umgekehrt. Daher ist die Anzahl der einzufügenden Einfügungen Länge (n) - Länge (lcs_string)Konvertieren von Zeichenfolge in Palindrom-Zeichenfolge mit minimalen Einfügungen

Welche Methode sollte verwendet werden, um die äquivalente Palindrom-Zeichenfolge zu finden, wenn man die Anzahl der einzuführenden Einfügungen kennt?

Zum Beispiel:

1) azbzczdzez

Anzahl der Einfügungen erforderlich: 5 Palindrome string: azbzcezdzeczbza

Obwohl mehrere Palindrom-Strings für die gleiche Zeichenfolge vorhanden sind, aber ich möchte nur finden, Palindrom?

Antwort

12

S[i, j] Lassen Sie stellt eine Unterkette von Zeichenkette S aus dem Index beginnend i und endend bei Index j (beide inklusive) und c[i, j] die optimale Lösung für S[i, j] sein.

Offensichtlich c[i, j] = 0 if i >= j.

Im Allgemeinen haben wir die Wiederholung:

enter image description here

2

Um näher auf VenomFangs beantworten, ist es eine einfache dynamische Programmierlösung zu diesem. Beachten Sie, dass ich annahm, dass hier nur Zeichen eingefügt werden dürfen (keine Löschung, Updates). Sei S eine Folge von n Zeichen. Die einfache Rekursion Funktion P hierfür ist:

= P [i+1 .. j-1], if S[i] = S[j] 

P [i..j]

= min (P[i..j-1], P[i+1..j]) + 1, 

Wenn Sie mehr Erklärung möchten, warum dies wahr ist, schreiben Sie einen Kommentar und ich würde sei froh zu erklären (obwohl es mit ein wenig Nachdenken ziemlich leicht zu sehen ist). Dies ist übrigens das genaue Gegenteil der von Ihnen verwendeten LCS-Funktion und bestätigt somit, dass Ihre Lösung tatsächlich optimal ist. Natürlich ist es völlig möglich, dass ich mich verpfuscht habe, wenn ja, jemand lässt es mich wissen!

Edit: Um sich für das Palindrom-Konto selbst, kann dies leicht geschehen wie folgt: Wie oben erwähnt, P [1..n] würde Ihnen die Anzahl von Einfügungen erforderlich, um diese Zeichenfolge ein Palindrom zu machen. Sobald das obige zweidimensionale Array aufgebaut ist, folgt das Palindrom:

Beginnen Sie mit i = 1, j = n. Jetzt, string output = "";

while(i < j) 
{ 
    if (P[i][j] == P[i+1][j-1]) //this happens if no insertions were made at this point 
    { 
     output = output + S[i]; 
     i++; 
     j--; 
    } 
    else 
    if (P[i][j] == P[i+1][j]) // 
    { 
     output = output + S[i]; 
     i++; 
    } 
    else 
    { 
     output = S[j] + output; 
     j--; 
    } 
} 
cout<<output<<reverse(output); 
//You may have to be careful about odd sized palindromes here, 
// I haven't accounted for that, it just needs one simple check 

Macht das besseres Lesen?

+0

Danke @kyun. Aber ich habe die Anzahl der einzuführenden Insertionen herausgefunden. Ich habe angegeben, dass ich die Palindrom-Saite nach dem Einfügen finden muss? Kannst du mir eine optimale Lösung geben? Danke im Voraus. – whitepearl

+0

Bearbeitet jetzt, hilft das? – kyun

-2

Einfach.Siehe unten :)

 String pattern = "abcdefghgf"; 
     boolean isPalindrome = false; 
     int i=0,j=pattern.length()-1; 
     int mismatchCounter = 0; 

     while(i<=j) 
     { 
      //reverse matching 
      if(pattern.charAt(i)== pattern.charAt(j)) 
       { 
        i++; j--; 
        isPalindrome = true; 
        continue; 
       } 

      else if(pattern.charAt(i)!= pattern.charAt(j)) 
       { 
        i++; 
        mismatchCounter++; 
       } 


     } 
     System.out.println("The pattern string is :"+pattern); 
     System.out.println("Minimum number of characters required to make this string a palidnrome : "+mismatchCounter); 
+0

Diese Lösung wird in den meisten Fällen keine richtige Antwort geben. Versuchen Sie OROP, es wird nur 1 Zeichen benötigt, dh P am Anfang, aber Ihre Lösung gibt die Antwort 2. – foobar

-1

PHP-Lösung von O (n)

function insertNode(&$arr, $idx, $val) { 
    $arr = array_merge(array_slice($arr, 0, $idx), array($val), array_slice($arr, $idx)); 
} 
function createPalindrome($arr, $s, $e) { 
    $i = 0; 
    while(true) { 
     if($s >= $e) { 
      break; 
     } else if($arr[$s] == $arr[$e]) { 
      $s++; $e--; // shrink the queue from both sides 
      continue; 
     } else { 
      insertNode($arr, $s, $arr[$e]); 
      $s++; 
     } 
    } 
    echo implode("", $arr); 
} 
$arr = array('b', 'e', 'a', 'a', 'c', 'd', 'a', 'r', 'e'); 
echo createPalindrome ($arr, 0, count ($arr) - 1); 
Verwandte Themen