给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
#!/bin/bash
#最长回文字串
#
echo "">result.txt
echo "$1"|sed 's#[][]*#\n#g'|egrep -v '^$' >test_1.txt
long=`cat test_1.txt|wc -l`
flag=true
declare -i aa=1
while :
do
bb=$[$aa+1]
sour=`sed -n "$aa p" test_1.txt|awk '{print $1}'`
sed -n "$bb,$ p" test_1.txt >test_2.txt
content=`grep -n "$sour" test_2.txt|tac`
#echo "$content"
if [ -n "$content" ];then
for i in $content
do
num_1=`echo "$i"|awk -F: '{print $1}'`
num_2=$[$num_1-1]
num_3=$[$num_2%2]
num_4=$[$num_2/2]
num_5=$[$num_4+1]
num_6=$[$num_4+2]
if [ $num_2 -eq 1 ];then
flag=flase
cc=$[$aa+2]
jishu=""
neirong=`sed -n "$aa,$cc p" test_1.txt`
for i in $neirong
do
jishu=$jishu$i
done
echo "$jishu">>result.txt
aa=$[$aa+2]
break
elif [ $num_3 -eq 1 ];then
jiequ_1=`sed -n "1,$num_4 p" test_2.txt`
qian=""
for item in $jiequ_1
do
qian=$qian$item
done
jiequ_2=`sed -n "$num_6,$num_2 p" test_2.txt|tac`
hou=""
for jj in $jiequ_2
do
hou=$hou$jj
done
if [ $qian = $hou ];then
flag=false
sum_1=$[$num_1+$aa]
result=`echo "$1"|cut -b "$aa-$sum_1"`
echo "$result">>result.txt
aa=$[$num_1+1]
fi
break
elif [ $num_2 -eq 0 ];then
flag=false
oushu_1=`sed -n "$aa,$num_1 p" test_1.txt`
oo=""
for i in $oushu_1
do
oo=$oo$i
done
echo "$oo">>result.txt
aa=$[$aa+2]
break
else
qian_2=`sed -n "1,$num_4 p" test_2.txt`
ou_1=""
for i in $qian_2
do
ou_1=$ou_1$i
done
hou_2=`sed -n "$num_5,$num_2 p" test_2.txt|tac`
hou_1=""
for i in $hou_2
do
hou_1=$hou_1$i
done
if [ $ou_1 = $hou_1 ];then
flag=false
sum=$[$num_1+$aa]
result=`echo $1|cut -b "$aa-$sum"`
echo "$result">>result.txt
aa=$[$num_1+2]
break
fi
fi
done
if [ $flag = true ];then
aa=$[$aa+1]
fi
else
aa=$[$aa+1]
fi
if [ $aa -ge $long ];then
battle=`awk '{print length,$0}' result.txt|sort -nr | head -n1 |awk '{print $2}'`
echo "$battle"
exit 0
fi
done
脚本效果:
脚本解析:
1、这个脚本花的时间较长,有几个需要考虑的点,但这里就不一一细说了
2、脚本中最重要的有如下几点:
一、获取"对称字符串"的方式,笔者文中是使用grep,并且搭配"tac"反向列出最长的对称字符
二:for循环的中断时间点,即检索的新位置,这里使用tac命令先从距离最远的对称字符开始
三:最长字符串的获取,使用awk专属命令 awk '{print length}'
【欢迎其他有兴趣的朋友一起讨论交流】