File tree Expand file tree Collapse file tree 1 file changed +58
-0
lines changed
Expand file tree Collapse file tree 1 file changed +58
-0
lines changed Original file line number Diff line number Diff line change 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+
You can’t perform that action at this time.
0 commit comments