กำหนดสตริงที่เราต้องตรวจสอบว่าความยาวของคำนำหน้าที่ยาวที่สุดซึ่งเป็นส่วนต่อท้ายของสตริงเช่นมีสตริง "abcab" ดังนั้น "ab" ในที่นี้มีความยาว 2 และเป็นสตริงย่อยที่ยาวที่สุดพร้อมคำนำหน้าเดียวกันและ คำต่อท้าย
ตัวอย่าง
Input: str[] = { “aabbccdaabbcc” } Output: 6 Input: abdab Output: 2
หากเราจะเริ่มต้นตัวชี้ตั้งแต่ต้นและสิ้นสุดของสตริง กว่าที่พวกเขาจะได้รับการคาบเกี่ยวกันในบางจุด แทนที่จะทำเช่นนั้น เราจะแยกสตริงออกจากตรงกลางและเริ่มจับคู่สตริงซ้ายและขวา หากมีขนาดส่งคืนเท่ากันของสตริงที่ตรงกัน ให้ลองใช้ความยาวที่สั้นกว่าทั้งสองด้าน
อัลกอริทึม
int longest(char str[], int n) START STEP 1 : DECLARE length AS 0 AND i AS n/2 STEP 2 : IF n < 2 THEN RETURN 1 STEP 3 :LOOP WHILE TILL str[i]!='\0' IF str[i] == str[length] THEN, INCREMENT length BY 1 INCREMENT i BY 1 ELSE IF length == 0 THEN, INCREMENT i BY 1 ELSE DECREMENT length BY 1 END IF END IF END WHILE RETURN length STOP
ตัวอย่าง
#include <stdio.h> int longest(char str[], int n){ int length = 0, i = n/2; if( n < 2 ) return 1; while( str[i]!='\0' ){ //When we find the character like prefix in suffix, //we will move the length and i to count the length of the similar prefix and suffix if (str[i] == str[length]){ ++length; ++i; } else //When prefix and suffix not equal{ if(length == 0) ++i; else --length; } } return length; } int main(int argc, char const *argv[]){ char str[] = {"abccmmabcc"}; int n = sizeof(str)/sizeof(str[0]); int length = longest(str, n); printf("Length = %d", length); return 0; }
ผลลัพธ์
หากเรารันโปรแกรมด้านบน มันจะสร้างผลลัพธ์ต่อไปนี้:
Length = 4