Længste palindrom-understreng i en streng i Java

Længste palindrom-understreng i en streng i Java

Et palindrom er en streng, der læses ens fra begge retninger. For eksempel er “racecar” et palindrom, fordi det læses ens fra venstre mod højre og højre mod venstre. En understreng er en sammenhængende delmængde af tegn i en streng.

Problemet med længste palindrom-understreng er at finde den længste understreng i en streng, der er et palindrom. Dette problem har mange anvendelser, såsom at finde gentagne understrenge i en tekst eller at sammenligne to strenge.

Der er mange forskellige algoritmer til at løse dette problem. En almindelig algoritme er Manachers algoritme, som er en lineær tidsalgoritme, der finder længste palindrom-understreng i en streng.

Manachers algoritme

Manachers algoritme er en lineær tidsalgoritme til at finde længste palindrom-understreng i en streng. Algoritmen fungerer ved at konstruere en præfikstabelsom indeholder længden af det længste palindrom centreret omkring hvert tegn i strengen.

For at konstruere præfikstablen itererer algoritmen over strengen og anvender følgende regel:

* Hvis det aktuelle tegn er et palindrom af længde 1, så er længden af det længste palindrom centreret omkring dette tegn 1.
* Ellers er længden af det længste palindrom centreret omkring dette tegn længden af det længste palindrom centreret omkring det forrige tegn plus 2.

Når præfikstablen er konstrueret, kan længste palindrom-understreng findes ved at finde det maksimum i præfikstablen.

Java-implementering

Følgende er en Java-implementering af Manachers algoritme:

java
public class LongestPalindromicSubstring {

public static String longestPalindromicSubstring(String str) {
// Konstruer præfikstablen
int[] p = new int[str.length()];
int center = 0;
int right = 0;
for (int i = 0; i < str.length(); i++) {
// Udvid intervallet omkring midten
int mirror = 2 * center - i;
if (right > i) {
p[i] = Math.min(right - i, p[mirror]);
}
// Udvid intervallet
while (i - p[i] - 1 >= 0 && i + p[i] + 1 < str.length() && str.charAt(i - p[i] - 1) == str.charAt(i + p[i] + 1)) {
p[i]++;
}
// Opdater midten og højre ende
if (i + p[i] > right) {
center = i;
right = i + p[i];
}
}

// Find længste palindrom-understreng
int maxLength = 0;
int start = 0;
for (int i = 0; i < str.length(); i++) {
if (p[i] > maxLength) {
maxLength = p[i];
start = i - maxLength;
}
}

return str.substring(start, start + maxLength + 1);
}

public static void main(String[] args) {
String str = "babad";
String longestPalindromicSubstring = longestPalindromicSubstring(str);
System.out.println("Længste palindrom-understreng i " + str + ": " + longestPalindromicSubstring);
}
}

Konklusion

Problemet med længste palindrom-understreng er et klassisk problem i computer science. Der er mange forskellige algoritmer til at løse dette problem, men Manachers algoritme er en af de mest kendte og effektive algoritmer.

Manachers algoritme er en lineær tidsalgoritme, der konstruerer en præfikstabel, der indeholder længden af det længste palindrom centreret omkring hvert tegn i strengen. Længste palindrom-understreng findes ved at finde det maksimum i præfikstablen.

Ofte stillede spørgsmål

1. Hvad er et palindrom?

Et palindrom er en streng, der læses ens fra begge retninger.

2. Hvad er et understreng?

En understreng er en sammenhængende delmængde af tegn i en streng.

3. Hvad er problemet med længste palindrom-understreng?

Problemet med længste palindrom-understreng er at finde den længste understreng i en streng, der er et palindrom.

4. Hvilken algoritme kan bruges til at løse problemet med længste palindrom-understreng?

Manachers algoritme er en almindelig algoritme til at løse problemet med længste palindrom-understreng.

5. Er Manachers algoritme en lineær tidsalgoritme?

Ja, Manachers algoritme er en lineær tidsalgoritme.

6. Hvordan konstrueres præfikstablen i Manachers algoritme?

Præfikstablen konstrueres ved at iterere over strengen og anvende følgende regel:

* Hvis det aktuelle tegn er et palindrom af længde 1, så er længden af det længste palindrom centreret omkring dette tegn 1.
* Ellers er længden af det længste palindrom centreret omkring dette tegn længden af det længste palindrom centreret omkring det forrige tegn plus 2.

7. Hvordan findes længste palindrom-understreng i Manachers algoritme?

Længste palindrom-understreng findes ved at finde det maksimum i præfikstablen.

8. Er der andre algoritmer til at løse problemet med længste palindrom-understreng?

Ja, der er andre algoritmer til at løse problemet med længste palindrom-understreng, såsom Knuth-Morris-Pratt-algoritmen og Boyer-Moore-algoritmen.

9. Kan Manachers algoritme bruges til at finde alle palindrom-understrenge i en streng?

Nej, Manachers algoritme kan kun bruges til at finde længste palindrom-understreng i en streng.