2019/10/20【最长回文字串】

给定一个字符串 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}'

【欢迎其他有兴趣的朋友一起讨论交流】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值