III. CÁC DẠNG BÀI TẬP THƯỜNG GẶP
3. Dạng 3: Một số bài tập xõu Palindrome
Xõu Palindrome hay cũn gọi là xõu đối xứng, cú nghĩa một xõu khi đọc cỏc ký tự trong xõu từ trỏi sang phải cũng giống từ phải sang trỏi thỡ xõu đú được gọi là xõu Palinhdrome.
Với những bài tập kiểm tra xõu Palindrome hay tỡm kiếm xõu cú tớnh chất Palindrome thỡ trước hết nờn xõy dựng hàm kiểm tra tớnh chất đối xứng của một xõu với độ phức tạp O(n), trờn cơ sở đú chỳng ta giải quyết những bài tập khú hơn.
Bài tập 1: Kiểm tra một xõu cú phải là xõu Palindrome khụng
Program kiemtra; Var i,x:byte; S1,s2:string; Begin Write(‘nhap xau s1’); Readln(s1); X:=length(s1); S2:=’’;
For i:=x downto 1 do s2:=s2+s1[i];
If s1=s2 then write(‘xau s1 la xau palindrome’) Else write(‘xau s1 khụng la xau palindrome’); Readln
End.
Bài tập 2:Xõu con Palindrome: Cho một xõu S cú độ dài khụng vượt quỏ 1000 kớ
tự; tỡm xõu palindrome dài nhất là xõu con của S.
- í tưởng: Sử dụng phương phỏp quy hoạch động bằng cỏch sử dụng mảng 2 chiều F và giỏ trị F[i, j] = true/false nếu đoạn gồm cỏc kớ tự từ i đến j của S cú/khụng là palindrome.
- F[i, i] = True
- F[i, j] = F[i+1, j-1]; ( nếu s[i] = s[j] ) - F[i, j] = False; ( nếu s[i] <> s[j] )
- Đoạn chương trỡnh tham khảo
var s:ansistring; n,i,j,d,max,k,csd,csc:longint; {GV giới thiệu thờm kiểu ansistring }
F: array[0..1001,0..1001] of boolean; {==========}
Begin
Write('nhap s:'); readln(s);
FillChar( F, sizeof(F), false ); n:=length(s); max:=1;
for i := 1 to n do F[i, i] := True; for k := 1 to (n-1) do
for i := 1 to (n-k) do begin
j := i + k;
F[i, j] := ( F[i+1, j-1] ) and (s[i] = s[j] ); end;
for i:=1 to n do
for j:=1 to n do begin
d:=j-i+1;
if (f[i,j]=true) and (d>max) then begin
max:=d; csd:=i; csc:=j; end;
end;
for i:=csd to csc do write(s[i]); readln;
End.