Skip to content

Commit a1b9c71

Browse files
authored
Add Longest Palindromic Substring in Tcl (#5066)
1 parent 09f7026 commit a1b9c71

File tree

1 file changed

+58
-0
lines changed

1 file changed

+58
-0
lines changed
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
proc usage {} {
2+
puts stderr {Usage: please provide a string that contains at least one palindrome}
3+
exit 1
4+
}
5+
6+
proc longestPalindromicSubstring {s} {
7+
if {$s eq ""} { return "" }
8+
9+
set processed "#[join [split $s ""] #]#"
10+
set n [string length $processed]
11+
set p [lrepeat $n 0]
12+
13+
set center 0
14+
set right 0
15+
set maxLen 0
16+
set maxCenter 0
17+
18+
for {set i 0} {$i < $n} {incr i} {
19+
set mirror [expr {2 * $center - $i}]
20+
if {$i < $right} {
21+
lset p $i [expr {min($right - $i, [lindex $p $mirror])}]
22+
}
23+
24+
while {
25+
($i + [lindex $p $i] + 1) < $n &&
26+
($i - [lindex $p $i] - 1) >= 0 &&
27+
[string index $processed [expr {$i + [lindex $p $i] + 1}]] eq \
28+
[string index $processed [expr {$i - [lindex $p $i] - 1}]]
29+
} {
30+
lset p $i [expr {[lindex $p $i] + 1}]
31+
}
32+
33+
if {$i + [lindex $p $i] > $right} {
34+
set center $i
35+
set right [expr {$i + [lindex $p $i]}]
36+
}
37+
38+
if {[lindex $p $i] > $maxLen} {
39+
set maxLen [lindex $p $i]
40+
set maxCenter $i
41+
}
42+
}
43+
44+
set start [expr {($maxCenter - $maxLen) / 2}]
45+
46+
return [string range $s $start [expr {$start + $maxLen - 1}]]
47+
}
48+
49+
if {$argc != 1} { usage }
50+
51+
set input [string trim [lindex $argv 0]]
52+
if {$input eq ""} { usage }
53+
54+
set result [longestPalindromicSubstring $input]
55+
if {[string length $result] <= 1} { usage }
56+
57+
puts $result
58+

0 commit comments

Comments
 (0)